【发布时间】:2014-08-16 16:19:18
【问题描述】:
我正在使用 Q javascript 承诺库并在浏览器中运行,我想弄清楚如何将承诺组链接在一起,以便每个组按顺序执行。例如,如果我有项目 A、B、C 和 D,我想将 A 和 B 组合在一起,然后将 C 和 D 组合在一起,这样 A 和 B 都必须在 C 和 D 执行之前完成。我创建了这个simple jsfiddle 来展示我当前的尝试。
var work_items = [ 'A','B','C','D','E','F','G','H','I' ];
var n = 2; // group size
var wait = 1000;
var getWorkPromiseFn = function (item) {
log("Getting promise function for " + item);
return function () {
log("Starting " + item);
var deferred = Q.defer();
setTimeout(function () {
var status = "Finished " + item;
log(status);
deferred.resolve(status);
}, wait);
return deferred.promise;
};
};
var queue = Q();
//log('Getting sequentially'); // One-by-one in sequence works fine
//work_items.forEach(function (item) {
// queue = queue.then(getWorkPromiseFn(item));
//});
log('Getting ' + n + ' at a time'); // This section does not
while (work_items.length > 0) {
var unit = [];
for (var i=0; i<n; i++) {
var item = work_items.shift();
if (item) {
unit.push(getWorkPromiseFn(item));
}
}
queue.then(Q.all(unit));
}
var inspect = queue.inspect(); // already fulfilled, though no work is done
看起来我可能在这里将错误的数组传递给Q.all,因为我传递的是一个返回承诺的函数数组,而不是承诺本身的数组。当我尝试直接在那里使用 Promise 时(例如 unit.push(Q().then(getWorkPromiseFn(item));),每个的工作都立即开始,没有顺序处理。我想我基本上不清楚以适当推迟小组执行的方式来代表小组的好方法。
那么,我怎样才能推迟执行一组这样的承诺呢?
【问题讨论】:
-
你有什么进展吗?
标签: javascript promise q