【问题标题】:How to wait for all promises to resolve in Google Client Library如何等待 Google 客户端库中的所有承诺得到解决
【发布时间】:2016-10-26 15:32:55
【问题描述】:

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

我正在努力实现以下目标:

  1. 从所有帐户(ID 数组)加载过滤器。
  2. 删除所有已加载的过滤器(从已加载的帐户中)。
  3. 完成所有删除操作后:向所有帐户添加新过滤器。
  4. 所有添加操作完成后:显示完成消息。

我在第 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 承诺对象。

【问题讨论】:

  • 可以“$http.pendingRequests.length !== 0;”帮助你检查是否所有的承诺都返回了?
  • 也许您正在寻找batch request?或者,在单个 promise 上调用 $.when(promise) 应该创建一个与 $.when 数组调用兼容的 jQuery deferred。
  • $.when(googleRequestPromise) 不像 jQueryPromise 那样工作。至少我不能让它工作。我没有让batch request 处理嵌套的.then 调用,例如.req.then(...).then( ...req2.then()... )

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


【解决方案1】:

从来没有关注过 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.');
        });
    });

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 2017-05-25
    • 2017-02-09
    • 2022-01-17
    • 2021-02-02
    • 2014-03-12
    • 2019-09-23
    • 1970-01-01
    相关资源
    最近更新 更多