【问题标题】:Using map for Promise.all returns array of undefined when returning promises nested in a then block当返回嵌套在 then 块中的承诺时,使用 map for Promise.all 返回未定义数组
【发布时间】:2019-07-24 00:22:38
【问题描述】:

我有一个问题。我目前正在学习如何使用 Promise,但我遇到了一个问题,经过大量搜索后我还没有找到答案。我正在尝试使用 map 来获取一系列承诺,这些承诺是在 Promise.all 中处理 then 块的结果,但以下内容不起作用,这里出了什么问题?

let promises = myArray.map(result => 
    {
        searchPromise(result.type).then((searchReply) => 
        {
            return processReply(result, searchReply)
        });
    }
);

Promise.all(promises).then(c => console.log(c)); //array of Undefined, but 
                                                 //want to get results from
                                                 //processReply function

【问题讨论】:

  • 同意存在一些语法错误,但您可能会得到一个未定义的数组,因为 myArray.map(...); 没有返回任何内容(undefined 的隐式返回)。
  • @PatrickRoberts 已修复,谢谢。
  • @user87002 您缺少退货声明。应该是 return searchPromise(... 或者,您可以删除箭头函数体上的花括号。

标签: javascript arrays function ecmascript-6 promise


【解决方案1】:

你的 map 函数没有返回任何东西,只有你的 then 函数:

let promises = myArray.map(result => 
    {
        return searchPromise(result.type).then((searchReply) => 
        {
            return processReply(result, searchReply)
        });
    }
);

或者,省略 cmets 中所述的花括号,以强制返回:

let promises = myArray.map(result => 
    searchPromise(result.type).then((searchReply) =>  processReply(result, searchReply)
 ));

【讨论】:

    【解决方案2】:

    您可能会得到一个充满undefined 的数组,因为您对myArray.map 的调用没有返回任何内容,因此隐式返回了undefined。假设searchPromiseprocessReply 都返回Promise,这应该可以工作:

    let promises = myArray.map(result => {
      return searchPromise(result.type).then((searchReply) => {
        return processReply(result, searchReply)
      });
    });
    
    Promise.all(promises).then(c => console.log(c));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-30
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 2017-02-21
      相关资源
      最近更新 更多