【发布时间】: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