问:连锁回调

时间:2015-07-23 01:37:03

标签: node.js promise gulp q

我试图按特定顺序运行回调。

基本上我有一个gulp任务,它接收一个包含四个CSS路径的数组。我需要缩小每个文件并打印有关进度的状态。这样的事情:

Minifying file AAA.css: OK
Minifying file BBB.css: OK
Minifying file CCC.css: FAIL
Minifying file DDD.css: OK

首先我写Minifying file AAA.css,所以我运行了一些gulp方法,on("end")on("error")它应该用OK\n或{{1}完成短语分别。

我的问题是它正在打印一些想法:

FAIL\n

这就是我尝试做的事情:

Minifying file AAA.css: Minifying file BBB.css: {...} DDD.css: Finished {...}.
OK
OK
FAIL
OK

我尝试使用gulp.task("watch", function () { var files = [ "AAA.css", "BBB.css", "CCC.css", "DDD.css" ]; var promise = Q(); underscore.each(files, function (file) { minify(promise, file); }); return promise; }); function minify(promise, file) { promise.then(function() { write("Minifying " + file + ": ") }); promise.then(function() { return gulp.src(file).{...} .on("error", function() { write("FAIL"); }) .on("end", function() { write("OK"); }) }); } 并为循环中的每个文件创建一个承诺,但没有成功......喜欢:

Q.defer()

我该怎么办?也许Promise或Deferred不会解决我的问题?

修改:我当前的代码为http://pastebin.com/tSaXH1iF

3 个答案:

答案 0 :(得分:0)

问题是通常的异步问题:gulp.src()将在您打印“Minifying ...”后很长时间内完成。解决方案是在打印“Minifying ...”消息之前等待它完成:

function minify(file) {
    var promise = Q();
    promise.then(function() {
        return gulp.src(file).{...}
            .on("error", function() { write("Minifying " + file + ":FAIL"); }) 
            .on("end", function() { write("Minifying " + file + ":OK"); }) 
    });

    return promise();
}

除非你想使用一些花哨的终端技巧将光标移动到正确的行以打印“OK”或“FAIL”,否则真的没有简单的方法。

答案 1 :(得分:0)

建立在slebetman的答案之上,我认为你没有正确地建立承诺(除非gulp.src返回承诺),你的代码会起作用但是当前状态承诺没有效果。

使用Q.defer,您可以宣传管道:

function minify(file) {
    var deferred = Q.defer();
    gulp.src(file).{...}
        .on("error", function(err) { write("Minifying " + file + ": FAIL"); deferred.reject(err);}) 
        .on("end", function() { write("Minifying " + file + ": OK");deferred.resolve(); });
    return promise();
}

答案 2 :(得分:0)

我终于找到了错误。基本上,.then()会期望"承诺工厂"而不是"承诺实例"。

我错误地运行了minifyCSS()函数,而不是将其绑定到.then()

缩小CSS功能:这是正确的。我创建了一个推迟并返回它的承诺。

var deferred = Q.defer();

gulp.src(...)
    .pipe(...)
    .on("end", ... deffered.resolve() ...);

return deferred.promise;

之前:

var promise = Q();

promise.then( ... start message ... );
promise.then(minifyCSS(file)); 

return promise;

<强>后:

var promise = Q();

promise.then( ... start message ... );
promise.then(minifyCSS.bind(null, file)); 

return promise;

请注意每个示例中的第二个.then()调用。

一个小的逻辑错误。当我在第一个示例(之前)上调用minifyCSS()时,Gulp立即执行,而不是在最后.then()完成后执行(如之后)。