【问题标题】:Node JS array of Promises still in <pending> [duplicate]Node JS 的 Promises 数组仍在 <pending> [重复]
【发布时间】:2020-03-13 01:04:49
【问题描述】:

我想在处理之前使用 Promises 对文件进行一些检查。

由于我使用的是 Node JS,我想异步进行所有验证,因为它们都是独立的。

但是,出于调试目的,我想一次打印所有错误(如果有的话)。所以我需要等待所有操作完成后再做任何其他事情。所以我使用了 async/wait 关键字。

这是我的代码:

async function isValid(file) {
         try {
            const check = [
                check1(file),
                check2(file),
                check3(file),
                check4(file),
                check5(file)
            ]

            let results = check.map(async checking => (await checking))
            console.log((await results));

         } catch(e) {
             console.log(e)
         }

}

问题是,console.log 输出的内容如下:

[
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> }
]

我期望得到的是 checks() 函数的结果,但尽管 await 关键字出现了多次,但它们仍然处于未决状态。

你知道我在做什么错吗?

提前致谢。

【问题讨论】:

  • async 和 map 不会做你想做的事。您仍然需要 Promise.all map 返回的内容。
  • 如果你真的想打印所有错误你应该使用Promise.allSettled
  • 感谢您的建议,他们给了我一个很好的指示 :) 我对当前上下文使用了另一种方法,但会注意这些命令以用于其他用途。

标签: javascript node.js asynchronous promise


【解决方案1】:

我想你想在这里使用Promise.all。您实际上不必执行 .map 逻辑来调用每个单独的函数和 await 它。只要check(&lt;file&gt;) 返回Promise,就对它们调用Promise.all。

例子:

async function isValid(file) {
  try {
    const check = [
      check1(file),
      check2(file),
      check3(file),
      check4(file),
      check5(file)
    ]

    const results = await Promise.all(check);
    console.log('results', results);

  } catch (e) {
    console.log(e)
  }

}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

【讨论】:

  • OP 想要I'd like to print all the errors at once,您的解决方案只显示第一个错误
  • 谢谢,这个解决方案实际上帮助了我。我手动处理了这些错误,因为我的 Promise 是 { success: false, reason: 'bad_file_type' } 形式的字典。我不确定这是一个好习惯
猜你喜欢
  • 2018-01-04
  • 2018-08-19
  • 2020-03-15
  • 2019-06-11
  • 2017-09-10
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多