【问题标题】:es5 using promise but returns defered before resolvinges5 使用 promise 但在解析之前延迟返回
【发布时间】:2020-07-21 11:19:46
【问题描述】:

我有一个递归函数,它运行良好,可以得到我需要的所有结果。一旦它进入第二个“then”块,它就会记录所有结果。然而,“return deferred.promise”发生在数据加载之前,这让我感到困惑,因为承诺只会在数据加载后才被解决。如果我在第二个 then 块中将 return deferred.promise 向上移动,则消耗代码告诉我这个方法是不可用的。有点困惑我错过了哪一部分,任何帮助将不胜感激。

代码

 function getUserGroups(groups, nextLink) {
            var deferred = $q.defer();
            var intermediaryGroupResult = groups;
            var endpoint = '';
            if (nextLink != '' && nextLink !== undefined) {
                endpoint = nextLink;
            } else {
                endpoint = config.baseGraphApiUrl + "me/memberOf?$select=id,displayName,securityEnabled";
            }
      

            (function (intermediaryGroupResult) {
                $http.get(endpoint).then(function (result) {

                    var dataNextLink = result.data['@odata.nextLink'];
                    var resultsFromGraph = result.data.value;

                    for (var i = 0; i < resultsFromGraph.length; i++) {
                        intermediaryGroupResult.push(resultsFromGraph[i]);
                    }

                    if (dataNextLink != '' && dataNextLink !== undefined) {
                        getUserGroups(intermediaryGroupResult, dataNextLink)
                    } else {
                        console.log('groups', intermediaryGroupResult);
                        return intermediaryGroupResult;
                    }
                }).then(function (allGroups) {
                    console.log('all groups', allGroups)

                    deferred.resolve(allGroups);
               
                });
            })(intermediaryGroupResult);

         
            return deferred.promise;
        }

控制台:

【问题讨论】:

  • promise 的整体理念是你可以在解决它们之前返回它们。
  • 你错过了 return 来自 then 回调的递归 getUserGroups(intermediaryGroupResult, dataNextLink) 调用。
  • @Bergi 谢谢你的指点,它现在可以工作了。至于使用 deferred,我已经停止使用它大约 3 年了,不幸的是我必须更新一个还没有 babel/async/await 的遗留系统。将代码重写为 AngularJs 中的常规 Promise 超出了范围。

标签: javascript promise ecmascript-5


【解决方案1】:

在 javascript 中,几乎没有阻塞代码。这意味着 http 请求将在后台运行,但您的代码仍将继续执行。发生的情况是您在数据加载之前返回了一个 unresolved 承诺,但它会在数据加载时解决。这很好,您只需在函数调用的结果上使用.then

【讨论】:

    【解决方案2】:

    几点建议:

    • 不需要延迟。 $http.get().then() 返回一个 Promise,它本身可以由函数返回。
    • IIFE 是不必要的。据推测,您正试图确保传递给函数的原始 groups 不会发生变异。
    • 要使用result.data.value 的其他成员创建groups 的副本,请使用Array.prototype.concat()spread syntax,如下所示; [].concat(...groups, ...result.data.value)
    • getUserGroups() 的递归调用缺少return

    通过进一步的简化,函数可以写成如下:

    function getUserGroups(groups, nextLink) {
        return $http.get(nextLink || config.baseGraphApiUrl + "me/memberOf?$select=id,displayName,securityEnabled")
        .then(function(result) {
            var intermediaryGroupResult = [].concat(...groups, ...result.data.value);
            var dataNextLink = result.data['@odata.nextLink'];
            return dataNextLink ? getUserGroups(intermediaryGroupResult, dataNextLink) : intermediaryGroupResult;
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2019-05-28
      • 2017-08-01
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多