![](/img/trans.png)
[英]AngularJS $q promises success callback gets executed in the wrong order
[英]When do Q promises get executed?
我有一个(看似基本的)问题理解承诺。 首先是代码:
'use strict';
var Q = require("q");
var mockPromise = function (statement) {
var deferred = Q.defer();
console.log("I'm running before I'm queued ...");
setTimeout(function () {
deferred.resolve(statement);
}, 5000);
return deferred.promise;
};
var promises = [
mockPromise("1st statement"),
mockPromise("2nd statement"),
mockPromise("3rd statement")
];
Q.all(promises)
.then(function (results) {
console.log(results);
});
每个诺言函数都会在将其添加到诺言数组时调用,而不是像我想的那样调用Q.all时。
我什么不来?
如何在不立即调用所说的承诺的情况下将一系列的承诺排队?
似乎混淆之处在于您了解为延迟评估而设计的promise API,事实并非如此。
承诺是处理长时间运行的请求的一种方式,它们的设计目的是立即启动以最小化等待时间,并利用链接和连接来阐明应如何处理这些长时间运行的请求的结果。
您可能会尝试利用api Q-Lazy ,它使您可以延迟对Promise的调用,直到它们被订阅为止。
通常,您会推迟异步功能,而不仅仅是值。 例如:
'use strict';
var Q = require("q");
var mockPromise = function (statement) {
var deferred = Q.defer();
console.log("I'm running before I'm queued ...");
setTimeout(function () {
deferred.resolve(statement());
}, 5000);
return deferred.promise;
};
var promises = [
mockPromise(function() {
console.log("running1");
return "1st statement";
}),
mockPromise(function() {
console.log("running2");
return "2nd statement";
}),
mockPromise(function() {
console.log("running3");
return "3rd statement";
}),
];
Q.all(promises)
.then(function (results) {
console.log(results);
});
需要注意的是延期功能会不管你是否曾经调用运行.then
上一个承诺。
让我展示一个使用标准承诺的示例。 它们的工作与Q承诺的工作几乎相同:
function mockPromise(value) { return new Promise(resolve => { console.log("I'm not running before I'm queued ..."); setTimeout(() => { resolve(value); }, 1000); }); } mockPromise("1st promise").then(x => { console.log(x); return mockPromise("2nd promise"); }).then(x => { console.log(x); return mockPromise("3nd promise"); }).then(x => { console.log(x); });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.