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

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

Susan Sarandon
发布: 2025-01-05 11:23:41
原创
762 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板