我试图按特定顺序运行回调。
基本上我有一个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
答案 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()
完成后执行(如之后)。