我的承诺在我认为应该解决之前就解决了
My promise is resolving before I think it should
我正在尝试使用 q promises 来处理一些 long-运行 ajax 请求和后续数据处理。我有一个案例,我试图创建一些应该按顺序执行的承诺,但它们似乎在我想要它们之前解决了,我不确定为什么。
主要顺序是首先尝试一些 "main" 应该异步完成的工作,然后做一些 "follow-up" 本身包含一组几个异步请求的工作。这是我的 fiddle 的主体,演示了这个问题:
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;
}
我的直接问题是下一项的 "main" 工作在某项的 "follow-up" 工作完成之前开始。我猜我只是没有正确处理承诺,不小心过早地解决了它,但我现在不知道如何。
我创建了一个 fiddle 来模拟我的问题。在其中,我看到 "two" 工作项的工作在 "one" 的后续工作完成之前开始。我如何确保在开始下一个主要工作之前完成每个项目的跟进?
https://jsfiddle.net/cfarmerga/cp323djx/1/
将您的 dofollowup 修改为 return 延迟似乎可以解决此问题。
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 deferred.promise; //you forgot this..
});
}
return to_do;
}
我正在尝试使用 q promises 来处理一些 long-运行 ajax 请求和后续数据处理。我有一个案例,我试图创建一些应该按顺序执行的承诺,但它们似乎在我想要它们之前解决了,我不确定为什么。
主要顺序是首先尝试一些 "main" 应该异步完成的工作,然后做一些 "follow-up" 本身包含一组几个异步请求的工作。这是我的 fiddle 的主体,演示了这个问题:
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;
}
我的直接问题是下一项的 "main" 工作在某项的 "follow-up" 工作完成之前开始。我猜我只是没有正确处理承诺,不小心过早地解决了它,但我现在不知道如何。
我创建了一个 fiddle 来模拟我的问题。在其中,我看到 "two" 工作项的工作在 "one" 的后续工作完成之前开始。我如何确保在开始下一个主要工作之前完成每个项目的跟进?
https://jsfiddle.net/cfarmerga/cp323djx/1/
将您的 dofollowup 修改为 return 延迟似乎可以解决此问题。
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 deferred.promise; //you forgot this..
});
}
return to_do;
}