为什么我的承诺会处于待定状态,我该如何解决呢?
var foundPeopleA = findPeopleA().then(function(result) {
var res = []
result.map(function(el) {
res.push(getProfileXML(el.sid));
});
return res
});
var foundPeopleB = findPeopleB().then(function(result) {
var res = []
result.map(function(el) {
res.push(getProfileXML(el.sid));
});
return res
})
return Promise.all([findPeopleA, findPeopleB]).then(function(results) {
console.log(results) //[ [ Promise { <pending> }, Promise { <pending> } ], [ Promise { <pending> }, Promise { <pending> } ] ]
})
但是,如果我将上述2个函数的主体更改为
var res
result.map(function(el) {
res = getProfileXML(el.sid);
});
return res
他们不会等待,我会得到结果。
答案 0 :(得分:1)
阵列不是承诺。如果你返回一个promises数组,then
会得到一个promises数组 - 就像你返回任何其他非promise值一样。只有当您返回承诺时,承诺才会在then
之前执行。你的foundPeopleA
和foundPeopleB
构造了一系列承诺;你需要连接这些数组并将它们传递给Promise.all
或同等数据,以便执行它们。
答案 1 :(得分:1)
问题是你使用then
分别处理每个承诺的承诺,而all
通过传递一个未解决的数组来处理多个承诺的实现承诺。它建立了一个新的承诺,将所有这些结果结合在一起。只需使用:
Promise.all([findPeopleA(), findPeopleB()])
.then(function(responses) ...
答案 2 :(得分:0)
尝试将数组分配给映射的结果。
var foundPeopleA = findPeopleA().then(function(result) {
var res = []
res = result.map(function(el) {
return getProfileXML(el.sid);
});
return res
});
或者,也许你可以解决这个承诺?
var foundPeopleA = findPeopleA().then(function(result) {
var res = []
res = result.map(function(el) {
return getProfileXML(el.sid);
});
resolve(res);
});
无论哪种方式,我都相信你需要通过从映射返回值来构建你的数组来创建新数组。