سؤال

أحاول كتابة مهام بلع تتطلب بعض مدخلات المستخدم عبر ملف البرنامج المساعد بلع موجه.لكني أواجه مشكلة في تمرير هذا الإدخال إلى جهات أخرى على سبيل المثال:

gulp.task('userinput', function(){

    var myVar = 'MONKEY';

    gulp.src('./templates/_component.*')
    .pipe(prompt.prompt([
        {
            type: 'input',
            name: 'userInput',
            message: 'Say something'
        }
    ], function(res){
        myVar = res.userInput;
    }))
    .pipe(prompt.confirm('You said ' + myVar));
});

على فرض أنني أدخل hello في الموجه، كنت أتوقع تأكيد القول You said Hello, ، لكنه يقول You said MONKEY.

هل هذا ممكن مع غلب؟

هل كانت مفيدة؟

المحلول

المشكلة هنا هي أنك تقوم بإنشاء الموجه الثاني ('You said ' + myVar) قبل تم تنفيذ المطالبة الأولى:

  1. تعيين myVar ل 'MONKEY'
  2. إنشاء تيارات
    1. يخلق src تيار، وهو غير متزامن
    2. أنشئ الموجه الأول وأضفه إلى دفق src
    3. قم بإنشاء المطالبة الثانية باستخدام القيمة الحالية لـ myVar, ، وإضافته إلى الدفق الفوري الأول
  3. الآن فقط تتم معالجة التدفقات المنفذة
    1. تحميل المصادر
    2. تشغيل الموجه الأول، قم بتعيين myVar
    3. قم بتشغيل المطالبة الثانية باستخدام الرسالة التي تم إنشاؤها مسبقًا

الحل الوحيد إذا كنت تريد الاحتفاظ بكل شيء كتدفق واحد هو استخدام المتغير داخل شيء يسمح بالإغلاق (الوظيفة).تقبل بعض المكونات الإضافية بالفعل الإغلاق كوسيطة، لكن معظمها لا تفعل ذلك.

أحد الحلول لتغليف الدفق في إغلاق يمكن أن يعمل هنا هو بلع الصنبور, ، وهو غير مصمم لهذا السيناريو على وجه التحديد، ولكن يجب أن يعمل.تبدو هكذا:

var tap = require('gulp-tap');

//...

gulp.task('userinput', function(){

    var myVar = 'MONKEY';

    gulp.src('./templates/_component.*')
    .pipe(prompt.prompt([
        {
            type: 'input',
            name: 'userInput',
            message: 'Say something'
        }
    ], function(res){
        myVar = res.userInput;
    }))
    .pipe(tap(function(file, t) {
        // format is t.through(stream-function, [arguments...])
        return t.through(prompt.confirm, ['You said ' + myVar]);
    });
});

نظرًا لأن هذا ملفوف في خاتمة، ويتم تقييمه لكل ملف، فسوف يلتقط الملف حاضِر قيمة للمتغير. ومع ذلك، نظرًا لأنه يعمل على كل ملف، فسترى المطالبة مرة واحدة كل تمت معالجة الملف.


الحل الأفضل هو تقسيم مهمتك إلى مهام متعددة ومعتمدة.سيبدو ذلك كالتالي:

var myVar = 'MONKEY';

gulp.task('userinput1', function(){

    return gulp.src('./templates/_component.*', {read: false})
        .pipe(prompt.prompt([
            {
                type: 'input',
                name: 'userInput',
                message: 'Say something'
            }
        ], function(res){
            myVar = res.userInput;
        }));
});

gulp.task('userinput', ['userinput1'], function() {
    return gulp.src('./templates/_component.*')
        .pipe(prompt.confirm('You said ' + myVar));
});

الآن المهمة الأولى (userinput1) سيتم تشغيله وإكماله قبل تتم معالجة الثاني (userinput2)، لذلك سيتم تعيين المتغير بشكل صحيح.

ملحوظة: تأكد أنك return الدفق من مهامك، وإلا فستتم معالجتها بشكل متزامن، ولن يتم تعيين المتغير الخاص بك.


وأخيرا، قد يكون من المنطقي أكثر للتخلي عن gulp-prompt المهمة تمامًا، لأنها لا علاقة لها كثيرًا بالتيار.ربما يكون من الأفضل لك استخدام Node JavaScript مباشرة ضمن مهمتك لجمع مدخلات المستخدم (ويفضل أن يكون ذلك بطريقة متزامنة)، ثم معالجة ملفاتك في تدفق متدفق بعد ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top