动态推入$q.all()承诺数组

Dynamic pushing to $q.all() promise array

本文关键字:承诺 数组 all 动态      更新时间:2023-09-26

基本上我试图在angular中创建一个承诺队列,它的工作方式有点像$q.all(),除了它允许我在 $q.all()执行后将更多的承诺推到数组上。

为了更好地解释,想象一下给一个函数一个承诺,你想为它执行then()的一些代码。然而,当你在等待第一个承诺解决时,你给了函数第二个承诺。现在我不希望在两者都完成之前调用then()(类似于$q.all())。如果第一个承诺在第二个承诺提供之前完成,then()函数将被调用两次。这应该可以用于任意数量的承诺。

本质上你结束了一个承诺队列,每次队列被清空时执行一次then()(即所有当前提供的承诺都被解决了)。我相信我能想出一个很好的方法来做到这一点,只是看看是否有人在SO镇已经实现了一些东西,或者有一个简单的选择,我错过了。

我也遇到过类似的情况,也许这对你有帮助。

我需要通过AJAX调用遍历树来构建一个表示整个树的对象。当我进行AJAX调用时,它将为我提供关于子节点的数据,然后我必须进行AJAX调用以获取它们的数据。我需要在渲染之前有完整的树,所以我需要知道我什么时候完成。

$q的问题。你可以给它传递一个承诺数组,但是这个数组在那时是固定的,即使你稍后向数组中添加更多的承诺。

我的解决方法是跟踪未应答请求的数量并重做$q。如果有未完成的请求。

var promisesArr = [];
var unresolved = 0;
function getChildNodes(node) {
   var url = BASE_URL + '/' + node.id;
   var prom = $q(function (resolve, reject) {
            unresolved++;
            $http.get(url).then(function (resp) {
            angular.forEach(resp.data.children, function(v){
               var newNode = {};
               newNode.id = v.id;
               getChildNodes(newNode);
               node.children.push(newNode);
            });
            resolve();
            unresolved--;
            }, function () {
                // Need to handle error here
                console.log('ERROR');
                reject();
                unresolved--;
            })
         });
    promisesArr.push(prom);
}
rootNode = {id: 1}
getChildNodes(rootNode);
allResolved();
    function allResolved() {
        if (unresolved > 0) {
            $q.all(promisesArr).then(allResolved);
        } else {
            RenderTree(rootNode);
        }
    }