gpt4 book ai didi

javascript - 单个 promise 之后的 promise 循环

转载 作者:行者123 更新时间:2023-12-03 11:36:19 26 4
gpt4 key购买 nike

我只需要写一个 promise ,然后,根据这个 promise 的结果,一个电影数组,我必须在数组内循环,并为每个元素进行远程调用(也带有 promise )以用附加数据装饰。我尝试过这种方法:

var deferred = $q.defer();
var promises = [];

angular.forEach(tree, function(node) {
promises.push(
APICall.GetMovieList(node).then(function(success){
var contents = {};
//simple data manipulation
return contents;
})
.then(function(contents){ /////////////////////// concatenation part that won't work
angular.forEach(contents, function(content) {
APICall.GetMovieDetails(content.ID).then(function(success){
content.metadata = success.metadata;
});
});
return contents;
})
);
});


$q.all(promises).then(ResolveFunction);

return deferred.promise;

为了可读性,我删除了 ResolveFunction,它只是管理 Promise 数组并执行 $q.resolve(results)。问题是,如果没有串联,它的工作方式就像一个魅力,但是有了必要的串联,它只会返回与之前相同的结果,它的行为是这样的,因为异步调用将在之后调用...创建另一个延迟并在连接部分嵌套 $q.all 并返回 $q.all 解决的数组 promise 是一个好主意吗?非常感谢

最佳答案

您不需要创建第二个deferred(您根本不需要deferred)。
只需执行以下操作:

var promises = [];

angular.forEach(tree, function(node) {
promises.push(
APICall.GetMovieList(node).then(function(success){
var contents = {};
//simple data manipulation
return contents;
})
.then(function(contents){
var contentPromises = [];
angular.forEach(contents, function(content) {
contentPromises.push(
APICall.GetMovieDetails(content.ID).then(function(success){
content.metadata = success.metadata;
})
);
});
return $q.all(contentPromises).then(function() {
return contents;
});
})
);
});

return $q.all(promises).then(function(nodes) {
return nodes;
});

这是一个工作 jsfiddle-demo 带有模拟的 APICall-Factory。

关于javascript - 单个 promise 之后的 promise 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26495900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com