如何等待所有承诺在Google客户端库中解决

时间:2015-06-26 13:05:08

标签: javascript jquery angularjs promise google-analytics-api

我使用Google Analytics Management API for JavaScript访问Google Analytics。

我试图实现以下目标:

  1. 从所有帐户(一组ID)加载过滤器。
  2. 删除所有已加载的过滤器(来自已加载的帐户)。
  3. 完成所有删除操作后:向所有帐户添加新过滤器。
  4. 完成所有添加操作后:显示完成消息。
  5. 我在第3点和第4点陷入困境。我无法等待承诺清单再次完成。

    半伪代码如下,我没有waitForAllPromises(listOfPromises):)

    var promises = [];
    for(accountId in accountIds) {
        (function(accountId){
            promise = 
                loadAccountFilters(accountId) // returns gapi.client.analytics....then()
                    .then(function(){
                        deleteAccountFilters(accountId); // returns gapi.client.analytics....then()
                    });
            promises.push(promise);
        })(accountId);
    }
    
    waitForAllPromises(promises)
        .then(function(){
            console.log('All delete operation done.');
    
            var promises = [];
            for(accountId in accountIds) {
                (function(accountId){
                    promise = addNewFilters(accountId); // returns gapi.client.analytics....then()
                })(accountId);
            }
            promises.push(promise);
    
            waitForAllPromises(promises)
            .then(function(){
                console.log('All add operation done.');
            });
        });
    

    我只能访问Google客户端库和jQuery,但似乎来自jQuery的$.when.apply($,promises).then(...),它可以等待所有承诺解析,不能与GCL承诺对象一起使用。

1 个答案:

答案 0 :(得分:0)

永远不要谈论Promise / $ q?你的逻辑很好!您应该将Promise.all / $ q.all替换为waitForAllPromises

var promises = [];
for(accountId in accountIds) {
    (function(accountId){
        promise = 
            loadAccountFilters(accountId) // returns gapi.client.analytics....then()
                .then(function(){
                    deleteAccountFilters(accountId); // returns gapi.client.analytics....then()
                });
        promises.push(promise);
    })(accountId);
}

Promise.all(promises) 
    .then(function(outputs) {
        console.log('All delete operation done.');

        var promises = [];
        for(accountId in accountIds) {
            (function(accountId){
                promise = addNewFilters(accountId); // returns gapi.client.analytics....then()
            })(accountId);
        }
        promises.push(promise);

        Promise.all(promises)
        .then(function() {
            console.log('All add operation done.');
        });
    });