动态推送到$ q.all()promise数组

时间:2014-07-09 07:31:25

标签: javascript angularjs queue angular-promise

基本上我试图在角度创建一个类似于$q.all()的承诺队列,除了它允许我在 {{1}之后将更多的承诺推送到数组例如,已经执行过。

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

基本上你最终会得到一个promise队列,每次清空队列时都会执行then()一次(即所有当前提供的promises都已解决)。我确信我能找到一个很好的方法来做到这一点,只是看看SO镇里的人是否已经实现了某些东西,或者我有一个简单的选择。

1 个答案:

答案 0 :(得分:0)

我面对类似的事情,也许会有所帮助。

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

$ q.all的问题是,你可以传递一个promises数组,但是即使你稍后向数组中添加更多的promises,数组也会被修复。

我的(诚然是hacky)解决方案是跟踪未答复请求的数量,如果有未完成的请求,则重做$ q.all。

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