【问题标题】:Promise.all returning undefined valuePromise.all 返回未定义的值
【发布时间】:2018-05-01 14:34:58
【问题描述】:

我有一个函数可以通过request-promise 向服务器发出多个请求:

query = function(entity) {
  //some SPARQL request here with the "entity" parameter
  rp(url)
  .then(function(res) {
    console.log(res)
    return new Promise(resolve => res)
  })
  .catch(function(err) {
    console.log("error")
  })
}

async function musicData() {
  data = [1,2,3,4]

  var queries = data.map(query)

  var results = await Promise.all(queries)

  return results
}

musicData()
.then(function(resp) {
  console.log(resp);
})
.catch(function(err) {
  console.log("err")
})

我不明白为什么musicData() 返回一个undefined 值的数组。考虑到query() 中的console.log(res) 记录了正确的响应,我该如何让它返回承诺?

【问题讨论】:

  • 将查询函数改为 query = async function($... 然后再试一次:)
  • @Kai 没用。
  • 我怀疑 return new Promise(resolve => res) 确实返回任何东西
  • @Bergi 它返回一个永远不会解决的承诺。
  • @JLRishe 是的,这就是我的意思。所以musicData() 永远不应该解析为任何东西的数组。

标签: javascript node.js asynchronous promise


【解决方案1】:

你没有从query 返回任何东西,所以没有承诺返回给映射函数,所以queries 最终成为undefineds 的数组。您也不应该在then 中使用return new Promise - 只需返回您想要稍后使用的值。改为:

const query = function(entity) {
  return rp(url)
    .then(function(res) {
       console.log(res);
       return res;
     })
     // ...

(注意不要隐式创建全局变量)

【讨论】:

    【解决方案2】:

    query 函数没有return 语句,所以它总是返回undefined。

    var queries = data.map(query) 因此会将数据映射到undefined 值的数组。

    您需要编辑query,使其返回一个 Promise。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 2019-02-25
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      • 2021-09-22
      相关资源
      最近更新 更多