【问题标题】:Promise.all returning undefined in Node JSPromise.all 在 Node JS 中返回 undefined
【发布时间】:2021-06-24 00:41:57
【问题描述】:

我有一个从第一个 API 获取目录名称的代码。对于每个目录,需要从第二个 API 获取文件名。我在我的 Node JS 代码中使用了类似的东西 -

async function main_function(req, res) {
  const response = await fetch(...)
    .then((response) => {
      if (response.ok) {
        return response.text();
      } else {
        return "";
      }
    })
    .then((data) => {
      dirs = ...some logic to extract number of directories...
      const tempPromises = [];

      for (i = 0; i < dirs.length; i++) {
        tempPromises.push(getFilename(i));
      }
      console.log(tempPromises); // Prints [ Promise { <pending> } ]
      Promise.all(tempPromises).then((result_new) => {
        console.log(result_new); // This prints "undefined"
        res.send({ status: "ok" });
      });
    });
}

async function getFilename(inp_a) {
  const response = await fetch(...)
    .then((response) => {
      if (response.ok) {
        return response.text();
      } else {
        return "";
      }
    })
    .then((data) => {
      return new Promise((resolve) => {
        resolve("Temp Name");
      });
    });
}

我在这里错过了什么?

【问题讨论】:

  • 您正在混合等待和链接以在getFileName 内部造成混乱。您不需要在其中使用带有then 的链接。只需在 await 行下方将其编写为普通代码并返回即可。这就是使用 await 的意义所在。
  • "这会打印 "undefined"" - 我不认为它可以。 Promise.all 创建一个始终通过数组实现的承诺。

标签: node.js promise fetch


【解决方案1】:

您的getFilename() 似乎没有返回任何内容,即它正在返回undefined。尝试在函数末尾返回response

async function getFilename(inp_a) {
  const response = ...

  return response;
}

【讨论】:

  • 它正在返回一个承诺。不是吗?
  • async 函数在调用时总是返回 promise,但在其中 promise 是您从实际函数返回的任何内容。在这种情况下,函数内部不会返回任何内容,因此一旦 promise 被解析,您就会从已解析的 promise 中获得 undefined 值。
【解决方案2】:

感谢Mat J 的评论。我能够简化我的代码,并且还学会了何时不使用链接。

还要感谢 Shadab 的 answer,它帮助我知道异步函数总是返回一个承诺,并且返回的是默认承诺,而不是实际的字符串。没有意识到这一点。 (我对 JS 很陌生)

这是我最终的有效代码/逻辑 -

async function main_function(req,res){
    try{
      const response = await fetch(...)
      const resp = await response.text();
      dirs = ...some logic to extract number of directories...
      const tempPromises = [];

      for (i = 0; i < dirs.length; i++) {
         tempPromises.push(getFilename(i));
      }
      
      Promise.all(tempPromises).then((result_new) => {
         console.log(result_new);
         res.send({ status: "ok" });
       });
    }
    catch(err){
       console.log(err)
       res.send({"status" : "error"})
    }
}

async function getFilename(inp_a) {
  const response = await fetch(...)
  respText = await response.text();
  return("Temp Name"); //
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多