首页 >web前端 >js教程 >为什么在 Promise 构造函数中使用 Async/Await 是反模式?

为什么在 Promise 构造函数中使用 Async/Await 是反模式?

Susan Sarandon
Susan Sarandon原创
2025-01-05 11:23:41873浏览

Why is Using Async/Await Inside a Promise Constructor an Anti-Pattern?

Promise 构造函数反模式:在 Promise() 中使用 Async/Await

在异步编程中,在执行器函数中使用 async/await Promise() 构造函数被认为是反模式。这种做法涉及在承诺中嵌入承诺,从而导致可能无法正确传播的潜在错误。

考虑下面的代码片段:

const { eachLimit } = require("async");

function myFunction() {
 return new Promise(async (resolve, reject) => {
   eachLimit((await getAsyncArray), 500, (item, callback) => {
     // do other things that use native promises.
   }, (error) => {
     if (error) return reject(error);
     // resolve here passing the next value.
   });
 });
}

在此示例中,调用了 myFunction 并且Promise 构造函数通过异步函数作为其执行器来调用。这种模式是有问题的,因为它可能导致错误无法正确传播。如果在eachLimit回调中发生任何错误,它们将不会被Promise捕获,并且会默默地失败。

此外,在Promise构造函数中使用async/await可能会让这些陷阱更加令人惊讶。例如,比较以下内容:

let p = new Promise(resolve => {
  ""(); // TypeError
  resolve();
});

(async () => {
  await p;
})().catch(e => console.log("Caught: " + e)); // Catches it.

在此示例中,TypeError 在执行器函数内同步抛出。然而,当使用 async/await 等待 Promise 时,错误会被 catch 块捕获,即使它发生在 Promise 被解析之前。此行为可能会导致混乱和意外结果。

为了避免这种反模式,建议避免在 Promise() 构造函数的执行器函数中使用 async/await。相反,使用 then 或 catch 方法来链接额外的 Promise 并处理错误。

以上是为什么在 Promise 构造函数中使用 Async/Await 是反模式?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn