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