【问题标题】:Promise.All returning emptyPromise.All 返回空
【发布时间】:2020-11-05 06:31:52
【问题描述】:

我有几个 api 调用请求,我试图创建承诺,然后使用 Promise.all 执行所有请求,但是它给出的是空值而不是数组。下面是我的代码。

function getUser(arrUser) {
  var student = [];
  return new Promise((resolve, reject) => {
    if (arrUser.length > 0) {
      var promises = arrUseridRequest.map(userRequeset => {
        return getRequest(userRequeset).then(result => {
          student.push(JSON.parse(result.body).result[0].Name);
          console.log(student); //This is giving right details.
        }).catch(error => {
          reject(error);
        });
      });

      Promise.all(promises).then(StuName => {
        resolve(StuName.join());
      })
    }
  });
}

这就是我试图立即获取值的方式:

getUser('123').then(student => {
  console.log(Student) //Coming as empty
});

getRequest是我的api调用nodeJs请求模块。我的代码有什么问题?

【问题讨论】:

  • 你正在使用 Promise 作为一个花哨的回调系统。 Promise 代表一个价值本身。所以你需要创建一个返回一些东西的承诺数组,而不是填充一些外部数组。然后使用 Promise.all 生成最终结果。
  • console.log(Student) 这是错字吗?这不应该是student 和小s 吗?
  • 不确定是否需要学生数组来存储结果,甚至是 new Promise 位。我认为... nm @YuryTarabanko 刚刚回答了我要做什么。
  • arrUser 参数在哪里使用?什么是arrUseridRequest
  • function getUsers(users) { return Promise.all( users.map(user => /* create a promise returning what you need for each user*/)} 写不出更有用的东西,因为你的代码 sn-p 中到处出现一些随机变量。

标签: javascript asynchronous promise


【解决方案1】:

您所有的promises 都满足undefined 的值,因为您只是记录学生姓名,而不是returnthen 回调中的它们。由于您似乎只执行一个请求,因此数组将是 [undefined],它被连接到空字符串中。

同时避免Promise constructor antipattern:

function getUsers(arrUser) {
  const promises = arrUser.map(userId => {
    return getRequest(userId).then(result => {
      const students = JSON.parse(result.body).result;
      return students[0].Name;
    });
  });
  return Promise.all(promises);
}
getUsers(['123']).then(studentNames => {
  console.log(studentNames);
  console.log(studentNames.join());
}).catch(console.error);

【讨论】:

    猜你喜欢
    • 2019-07-17
    • 2017-02-26
    • 2020-08-06
    • 2018-02-20
    • 2021-04-11
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多