【问题标题】:Promise.all() return undefinedPromise.all() 返回未定义
【发布时间】:2018-11-03 05:25:11
【问题描述】:

我有一个包含三个宠物名字的数组。一个是不正确的。目标是从 api 获取宠物,如果宠物不存在,则返回仅包含现有宠物名称的更改数组。问题是 Promise.all() 返回 undefined。

const getValidPets = async (pets) => {
    const petsArray = pets.map(async (pet) => {
      try {
        const record = await getPetHttp(pet);
        return record.name;
      } catch (error) {
        return undefined;
      }
    });
    return Promise.all(petsArray).then((filteredPets) => {
      const arr = filteredPets.filter(petName => petName !== undefined);
      return arr; // ["Rex", "Jug"] - here is correct!
    });
};

const pets = ["Rex", "Jug", "some_wrong_name"];
const finalPets = await getValidPets(pets); // undefined - incorrect

【问题讨论】:

  • 您的数组是strings 的数组,而不是Promises 的数组
  • 我的目标 - 得到所有宠物的承诺,将它们的(有效)名称作为字符串数组返回
  • 您的代码可以正常工作:codepen.io/anon/pen/WYNbKP?editors=0012。您一定是遗漏了什么,或者最后没有记录正确的值。
  • 您的代码在模拟 HTTP 函数中运行良好:jsfiddle.net/srqv7pob
  • 请提供minimal reproducible example - 正如已经说过的,只要getHttp(pet) 被模拟或等效,您的示例代码就可以工作。

标签: javascript arrays promise es6-promise


【解决方案1】:

试试这个:

const getValidPets = async (pets) => {
    const petsArray = pets.map(pet => getPetHttp(pet).then(record => record.name).catch(() => undefined));

    return Promise.all(petsArray).then((filteredPets) => {
        const arr = filteredPets.filter(petName => petName !== undefined);
        return arr; // ["Rex", "Jug"] - here is correct!
    });
};

const pets = ["Rex", "Jug", "some_wrong_name"];
const finalPets = await getValidPets(pets); // undefined - incorrect

【讨论】:

  • 我需要try catch,因为它会在无效宠物上崩溃
  • 崩溃意味着拒绝getPetHttp返回的承诺? catch 部分应该处理这个问题。
  • @Jaime Array.prototype.map 方法在程序上执行请求,Promise.all 应注意以并发方式执行此操作。
  • @TeodorKolev 所有这些代码都包含在async 函数中吗? await 只在异步函数中有效。
  • 是的,下面两行在异步函数中
猜你喜欢
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 2016-04-21
  • 2019-02-25
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 2017-02-26
相关资源
最近更新 更多