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...
    });