javascript - معنى - npm



تمرير المتغيرات بين "أنابيب" في غولب (1)

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

  1. تعيين myVar إلى 'MONKEY' myVar 'MONKEY'
  2. إنشاء مجموعات بث
    1. إنشاء تيار src ، وهو غير متزامن
    2. إنشاء المطالبة الأولى، وإضافته إلى تيار سرك
    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 تماما، لأنها لا تملك الكثير من العمل مع التيار. ربما كنت أفضل حالا باستخدام جوداسكريبت نود مباشرة ضمن مهمتك لجمع مدخلات المستخدم (ويفضل أن يكون ذلك بطريقة متزامنة)، ثم معالجة الملفات الخاصة بك في غول-ستريم بعد ذلك.

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

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 .

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





gulp