所以我有一个情况,我有多个未知长度的promise链。我想在所有的链都被处理完后运行一些动作。这可能吗?下面是一个例子:
app.controller('MainCtrl', function($scope, $q, $timeout) {
var one = $q.defer();
var two = $q.defer();
var three = $q.defer();
var all = $q.all([one.promise, two.promise, three.promise]);
all.then(allSuccess);
function success(data) {
console.log(data);
return data + "Chained";
}
function allSuccess(){
console.log("ALL PROMISES RESOLVED")
}
one.promise.then(success).then(success);
two.promise.then(success);
three.promise.then(success).then(success).then(success);
$timeout(function () {
one.resolve("one done");
}, Math.random() * 1000);
$timeout(function () {
two.resolve("two done");
}, Math.random() * 1000);
$timeout(function () {
three.resolve("three done");
}, Math.random() * 1000);
});
在这个例子中,我为promises 1,2和3设置了一个$q.all()
,它们将在某个随机时间被解析。然后我将promises添加到1和3的末尾。我希望当所有链都被解析时,all
也会被解析。下面是我运行这段代码时的输出:
one done
one doneChained
two done
three done
ALL PROMISES RESOLVED
three doneChained
three doneChainedChained
有没有办法等锁链解开?
6条答案
按热度按时间vwoqyblh1#
我希望在所有的锁链都解开的时候,一切都能解开。
当然,然后只需将每条链的promise传递到
all()
中,而不是最初的promise:vu8f3i0k2#
accepted answer是正确的。我想提供一个例子来详细说明一下,对那些不熟悉
promise
的人。示例:
在我的示例中,我需要在呈现内容之前用不同的镜像URL替换
img
标记的src
属性(如果可用)。说明:
AngularJS docs:
then
方法:then(successCallback,errorCallback,notifyCallback)-无论promise何时被解析或拒绝,只要结果可用,就异步调用success或error中的一个回调。调用回调时使用单参数:结果或拒绝原因。
$q.all(promises)
将多个promise合并为一个promise,当所有输入promise都被解析时,该promise将被解析。
promises
参数可以是一个promise数组。关于
bind()
,更多信息在这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bindwtzytmuj3#
最近有这个问题,但与未知数量的承诺。解决使用jQuery.map()。
dohp0rv54#
有办法的
$q.all(...
您可以检查以下内容:
http://jsfiddle.net/ThomasBurleson/QqKuk/
http://denisonluz.com/blog/index.php/2013/10/06/angularjs-returning-multiple-promises-at-once-with-q-all/
nbnkbykc5#
您可以使用"await" in an "async function"。
注意:我不能100%确定你可以从一个非异步函数调用一个异步函数并得到正确的结果。
也就是说,这永远不会在网站上使用。但对于负载测试/集成测试......可能会。
示例代码:
00jrzges6#
我在ocLazyLoad库中使用了这个例子: