Javascript 在“之间传递变量”;管道;狼吞虎咽

Javascript 在“之间传递变量”;管道;狼吞虎咽,javascript,gulp,Javascript,Gulp,我正试图编写一个吞咽任务,通过。但我很难将输入传递给其他人,例如: gulp.task('userinput', function(){ var myVar = 'MONKEY'; gulp.src('./templates/_component.*') .pipe(prompt.prompt([ { type: 'input', name: 'userInput', messag

我正试图编写一个吞咽任务,通过。但我很难将输入传递给其他人,例如:

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
,我希望确认信息会说
你说hello
,但它会说
你说MONKEY


这是不是可以喝一口

这里的问题是,在执行第一个提示之前,您正在创建第二个提示(
'yousaid'+myVar
):

  • myVar
    设置为
    'MONKEY'
  • 创建流
  • 创建
    src
    流,它是异步的
  • 创建第一个提示符,并将其添加到src流中
  • 使用当前值
    myVar
    创建第二个提示,并将其添加到第一个提示流中
  • 直到现在才处理执行的流
  • 负荷源
  • 运行第一个提示符,设置
    myVar
  • 使用先前生成的消息运行第二个提示符

  • 如果您想将其作为一个单一流保存,唯一的解决方案是在允许闭包(函数)的内容中使用变量。一些插件已经接受闭包作为参数,但大多数插件不接受闭包

    将流封装在闭包中的一个解决方案在这里是可行的,它不是专门为这个场景设计的,但应该是可行的。看起来是这样的:

    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));
    });
    
    因为它被包装在闭包中,并对每个文件求值,所以它将获取变量的当前值但是,由于它对每个文件都有效,因此对于处理的每个文件,您都会看到一次提示。


    更好的解决方案是将任务分为多个相互依赖的任务。看起来是这样的:

    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
    )之前运行并完成,因此变量将被正确设置

    注意:确保
    返回任务中的流,否则将同步处理这些流,并且不会设置变量



    最后,完全放弃
    gulpprompt
    任务可能更有意义,因为它实际上与流没有多大关系。您最好在任务中使用直节点JavaScript来收集用户的输入(最好是以同步方式),然后在之后以一口气流的方式处理文件。

    FYI:我选择了听从您的建议,跳过了一口气。当你们只有一把锤子的时候,一切看起来都像钉子一样。@过分热情的解释真的很好,你们说得对,保持简单。这真的很有帮助!谢谢你关于退货的通知!!