【发布时间】:2017-09-09 04:55:12
【问题描述】:
我正在尝试使用 q promises 来处理一些长时间运行的 ajax 请求和后续数据处理。我有一个案例,我试图创建一些应按顺序执行的承诺,但它们似乎在我想要它们之前解决了,我不知道为什么。
主要顺序是首先尝试一些应该异步完成的“主要”工作,然后做一些“后续”工作,这些工作本身包含一组几个异步请求。这是我的小提琴的主体,它演示了这个问题:
var to_do = ["one", "two", "three", "four"];
var result = Q();
to_do.forEach(function (item) {
result = result
.then(dowork.bind(null, item))
.fail(handleError)
.then(dofollowup.bind(null, item));
});
var dowork = function (value) {
var deferred = Q.defer();
log("About to do main work for " + value);
setTimeout(function () {
if (value === 'two') {
// represent a possible error in this work, but we still need to do follow-up work
deferred.reject("An error occurred doing work for number two, but we should continue");
} else {
log("Done main work for " + value);
deferred.resolve(value);
}
}, 1000);
return deferred.promise;
}
var dofollowup = function (value) {
log("Doing follow-up work for " + value);
var to_do = Q();
for (var i=0; i<5; i++) {
to_do = to_do.then(function () {
var deferred = Q.defer();
setTimeout(function () {
log("Doing delayed work for " + value);
deferred.resolve();
}, 100);
});
}
return to_do;
}
我的直接问题是下一个项目的“主要”工作是在一个项目的“后续”工作完成之前开始的。我猜我只是没有正确处理承诺并且不小心过早地解决了它,但我现在不知道如何。
我创建了一个模拟我的问题的小提琴。在其中,我看到“二”工作项的工作在“一”的后续工作完成之前开始。如何确保在开始下一个主要工作之前完成每个项目的后续工作?
【问题讨论】:
-
你忘记在你的 dofollowup 中返回你的 deferred 承诺。IOW:你创建了一个 deferred 但从未返回它。
标签: javascript promise q