javascript - NodeJS del 模块 Promise 需要明确的 Promise 函数吗?

标签 javascript node.js npm gulp del

我不明白为什么这个 del 函数需要一个新函数来实现它的 promise 。下面是完整的代码。问题出在 clean 函数中。

gulp.task('styles', ['clean-styles'], function () {
log('Compiling less to css');

return gulp
    .src(config.less)
    .pipe($.less())
    .pipe($.autoprefixer({browsers: ['last 2 version', '> 5%']}))
    .pipe(gulp.dest(config.temp));

});

gulp.task('clean-styles', function (done) {
    var files = config.temp + '**/*.css';
    return clean(files, done);
});

gulp.task('less-watcher', function () {
    gulp.watch([config.less], ['styles']);
});

////////////////

function clean(path, done) {
    log('Cleaning: ' + $.util.colors.blue(path));

    console.log(typeof done); // prints 'function'
    del([path]).then(done); // errors
}

function log(msg) {
    if (typeof msg === 'object') {
        for (var item in msg) {
            if (msg.hasOwnProperty(item)) {
                $.util.log($.util.colors.blue(msg[item]));
            }
        }
    } else {
        $.util.log($.util.colors.blue(msg));
    }
}

这是我得到的错误:

[23:28:32] Using gulpfile ~/WebstormProjects/gulp-tutorial/gulpfile.js
[23:28:32] Starting 'clean-styles'...
[23:28:32] Cleaning: ./.temp**/*.css
function
[23:28:32] 'clean-styles' errored after 36 ms
[23:28:32] Error    
at formatError (/usr/lib/node_modules/gulp/bin/gulp.js:169:10)    
at Gulp.<anonymous> (/usr/lib/node_modules/gulp/bin/gulp.js:195:15)    
at emitOne (events.js:96:13)    
at Gulp.emit (events.js:188:7)    
at Gulp.Orchestrator._emitTaskDone (/home/user/WebstormProjects/gulp-tutorial/node_modules/orchestrator/index.js:264:8)    
at /home/user/WebstormProjects/gulp-tutorial/node_modules/orchestrator/index.js:275:23    
at finish (/home/user/WebstormProjects/gulp-tutorial/node_modules/orchestrator/lib/runTask.js:21:8)    
at cb (/home/user/WebstormProjects/gulp-tutorial/node_modules/orchestrator/lib/runTask.js:29:3)

如果我像下面这样更改“clean”函数的代码,它会奇怪地解决问题。为什么它拒绝一个函数但接受另一个函数?

function clean(path, done) {
    log('Cleaning: ' + $.util.colors.blue(path));

    console.log(typeof done); // prints 'function'
    del([path]).then(function () {
        done(); // works!
    });
}

即使我使用分配给变量而不是提升的函数,它仍然有效。那么为什么它不接受 promise 中的“完成”功能呢?这让我很困惑。

function clean(path, done) {
    log('Cleaning: ' + $.util.colors.blue(path));

    console.log(typeof done); // prints 'function'
    var test = function () {
        done();
    }
    del([path]).then(test);
}

----------已解决----------

感谢 Johannes Merz 为我回答这个问题。我认为“完成”函数是我的回调,但我错了。它属于 gulp,因此要模拟问题,请检查下面的新“clean”功能。

function clean(path, done) {
    log('Cleaning: ' + $.util.colors.blue(path));

    del([path]).then(function (val) {
        console.log(val);
        done('Not null or undefined so this will fail it');
        // done(); but this would work!
    });
}

基本上,promise 会将一个参数传递给promise 使用的函数。这把事情搞砸了,因为“完成”回调认为该参数是错误消息或对象。现在这对我来说非常有意义。

done(err);

因此,如果 'err' 为 null 或未定义,我们不会有任何问题。问题是 Promise 不知道这一点。 Promise 传递的是一条消息,而不是一个错误,但完成函数认为它是一个错误,所以它会出错。

问题已解决:)

最佳答案

这是因为 del 函数解析了带有值的 Promise。看一下文档,done 如果传递了 undefined 则认为成功:

https://github.com/gulpjs/gulp/blob/master/docs/API.md#accept-a-callback

因此,如果您直接将 did 传递给 then block ,则调用 done('some value that isn't undefined') ,这在调用 done();< 时被视为错误 如果你将它包装在一个额外的函数中。尝试一下

del([path]).then(function (delResult) {
    console.log(delResult);
    done(); // works!
});

查看返回的内容。

关于javascript - NodeJS del 模块 Promise 需要明确的 Promise 函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42868752/

相关文章:

javascript - 此 .ejs 文件中的 else 语句显示错误 "Unexpected token else in/home/ubuntu/workspace/v1/views/home.ejs while compiling ejs"

javascript - 将 rails 值分配给全局变量并在 javascript 中使用它

node.js - docker stack与mssql和node,如何正确连接到数据库?

javascript - 谷歌浏览器中 window.open() 的功能

node.js - 编写大量类似函数/流程的最佳实践

angularjs - Node Express 不是重定向,而是返回一个字符串

javascript - 如何使 gulp 任务跨平台。特别是gulp-shell

node.js - NPM - 有条件添加全局路径

node.js - Windows Subsystem for Linux (WSL) 使用共享 Node.js 安装与 Windows : Node. js npm 和 npx 二进制文件不起作用

javascript - Windows 8 html5 javascript 应用程序中向左滑动的事件名称是什么?