JS - 运行 按 $q.when() 顺序排列的 promise,最后我该如何添加?
JS - Run the promises in order with $q.when(), how do I add finally?
我正在使用外部源生成对象,目的是处理它们的回调样式。不幸的是,这些回调可以超出浏览器的堆栈限制,我必须记住 IE 的最坏情况 500。
我已经使用 $q.when
重写了我的代码
$scope.combinations.forEach(function(combination) {
chain = chain.then(function() {
return generateConfiguration(combination);
});
});
generateConfiguration 如果一个函数 returns 一个承诺。一切正常,但我想做的是在链的末尾添加 finally()。
到目前为止我所做的是在 generateConfiguration 中有一个跟踪器识别最后的组合并触发应该由 finally.
触发的内容
有更简洁的方法吗?
是的,有:注入 $q
(即 promise 框架)并重写到
$q.all($scope.combinations.map(function(combination) {
return generateConfiguration(combination);
})).finally(function(res) {
/* ... */
});
这样,您还将并行触发所有 generateConfiguration(s)(至少尽可能多 - 就像 XHR 上的限制一样)。无论如何:$q.all(arrayOfPromises)
可能就是您一直在寻找的东西。
这取决于你想做什么。
你正在创建一个承诺 chain,所以如果你想要链的 single finally
,只需添加它在最后 after 构建它 forEach
:
// ...your forEach here, then:
chain.finally(/*...*/);
如果你想在 each 上有一个 finally
来自 generateConfiguration
的承诺,要么给自己一个包装函数来做到这一点,要么在 forEach
回调。
$scope.combinations.forEach(function(combination) {
chain = chain.then(function() {
return generateConfiguration(combination).finally(/*...*/); // <==
});
});
旁注:通过 reduce
:
有一种更惯用的方式来构建该链
var chain = $scope.combinations.reduce(function(chain, combination) {
return chain.then(function() {
return generateConfiguration(combination);
});
}, Promise.resolve());
添加最后一个 finally
(上面的选项 #1):
var chain = $scope.combinations.reduce(function(chain, combination) {
return chain.then(function() {
return generateConfiguration(combination);
});
}, Promise.resolve())
.finally(function() {
// ...do stuff here...
});
我正在使用外部源生成对象,目的是处理它们的回调样式。不幸的是,这些回调可以超出浏览器的堆栈限制,我必须记住 IE 的最坏情况 500。
我已经使用 $q.when
重写了我的代码 $scope.combinations.forEach(function(combination) {
chain = chain.then(function() {
return generateConfiguration(combination);
});
});
generateConfiguration 如果一个函数 returns 一个承诺。一切正常,但我想做的是在链的末尾添加 finally()。
到目前为止我所做的是在 generateConfiguration 中有一个跟踪器识别最后的组合并触发应该由 finally.
触发的内容有更简洁的方法吗?
是的,有:注入 $q
(即 promise 框架)并重写到
$q.all($scope.combinations.map(function(combination) {
return generateConfiguration(combination);
})).finally(function(res) {
/* ... */
});
这样,您还将并行触发所有 generateConfiguration(s)(至少尽可能多 - 就像 XHR 上的限制一样)。无论如何:$q.all(arrayOfPromises)
可能就是您一直在寻找的东西。
这取决于你想做什么。
你正在创建一个承诺 chain,所以如果你想要链的 single finally
,只需添加它在最后 after 构建它 forEach
:
// ...your forEach here, then:
chain.finally(/*...*/);
如果你想在 each 上有一个 finally
来自 generateConfiguration
的承诺,要么给自己一个包装函数来做到这一点,要么在 forEach
回调。
$scope.combinations.forEach(function(combination) {
chain = chain.then(function() {
return generateConfiguration(combination).finally(/*...*/); // <==
});
});
旁注:通过 reduce
:
var chain = $scope.combinations.reduce(function(chain, combination) {
return chain.then(function() {
return generateConfiguration(combination);
});
}, Promise.resolve());
添加最后一个 finally
(上面的选项 #1):
var chain = $scope.combinations.reduce(function(chain, combination) {
return chain.then(function() {
return generateConfiguration(combination);
});
}, Promise.resolve())
.finally(function() {
// ...do stuff here...
});