所以我有一些需要解决的承诺,所以我可以获得数据。当然,我可以使用方便的promise.all()
。不幸的是,其中一个承诺会返回另一组承诺。是否有可能获得这些承诺?
例如:
var result = {};
let pName = getName(); // returns promise<string>
let pAge = getAge(); // returns promise<string>
let pSchools = getSchools; // returns promise<Array<promise<string>>>
return promise.all([pName, pAge, pSchool]).then(function(res) {
result["name"] = res[0];
result["age"] = res[1];
result["schools"] = [];
// This next section I don't think will work because it doesn't resolve "in time".
res[2].map(function(school) {
school().then(theSchool => result["schools"].push(theSchool))
});
return result;
}); // returns promise<{
// "name": "string",
// "age": "string",
// "schools": [string1, ..., stringN]
// }>
有没有人必须做这样的事情?你是怎么做到的?
答案 0 :(得分:3)
你需要从内部Promise中返回结果来解析学校:
return promise.all([pName, pAge, pSchool]).then(function(res) {
return promise.all(res[2].map(school => school()))
.then(schools => {
result["name"] = res[0];
result["age"] = res[1];
result["schools"] = schools;
return result;
});
}));
});
答案 1 :(得分:1)
由于getSchools
会返回字符串承诺数组的承诺,因此您需要在pSchool
内传播promise.all
数组,如下所示:
return promise.all([pName, pAge, ...pSchool]).then(function(res) {
result["name"] = res[0];
result["age"] = res[1];
result["schools"] = res.splice(0,2);
return result;
});