从承诺承诺中获取数据以及其他数据(promise.all)

时间:2016-11-10 14:51:39

标签: javascript protractor

所以我有一些需要解决的承诺,所以我可以获得数据。当然,我可以使用方便的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]
     //  }>

有没有人必须做这样的事情?你是怎么做到的?

2 个答案:

答案 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;
});