【问题标题】:Async promise executor functions异步承诺执行器函数
【发布时间】:2021-01-22 13:28:13
【问题描述】:

我有一个返回 Promise 的函数,如下所示:

async function processFolder(folder) {
    return new Promise(async (res) => {
        const table = {};
        const list = await getHTMLlist(folder);
        if (list.length === 0) res(table);
        for (let i = 0; i < list.length; i++) {
            await processFile(folder, list[i], table);
        }
        res(table);
    });
}

我正在使用 ESLint 警告我:

"Promise executor functions should not be async" 这是 no-async-promise-executor 规则,由于 Promise 声明中的 async 关键字而引发错误.

我已经使用 ESLint 文档的this 页面上建议的技术并在this 答案中显示的技术在代码的其他部分修复了相同的问题,但在我的使用中案例我真的不知道如何重构代码以避免该错误。欢迎任何建议

【问题讨论】:

  • 你为什么用 promise 构造函数包裹 await getHTMLlist(folder)await processFile(folder, list[i], table);async 函数已经返回了一个承诺,所以你不需要创建一个新的并返回它
  • 该函数读取并解析给定文件夹,循环遍历文件夹内的所有文件,收集将存储在对象“表”中的一些数据。当文件夹中的每个文件都被读取时,这个承诺就完成了。然后通过“表”作为参数来解决承诺
  • @Lux 不幸的是,不,我知道这个问题,我阅读了它并将答案应用于我的代码中的不同用例,但是在这种情况下,我必须处理 Promise 中的几个等待,其中一些它们在循环中生成。答案很简单,但与那个问题无关

标签: javascript promise async-await eslint


【解决方案1】:

您不需要自己创建新的 Promise,因为 async 函数总是返回一个 Promise。如果async 函数的返回值不是一个promise,它会被隐式地包装在一个promise 中。

因此,您需要删除创建新 Promise 实例的代码,并且 executor 函数内的代码应位于 processFolder 函数的顶层。

您的代码可以简化如下:

async function processFolder(folder) {
    const table = {};
    const list = await getHTMLlist(folder);

    if (list.length > 0) {
       for (let i = 0; i < list.length; i++) {
           await processFile(folder, list[i], table);
       }
    }

    return table;
}

理想情况下,您还应该将processFolder 函数内的代码包装在try-catch 块中,以捕获和处理在执行此函数期间可能发生的任何错误。

【讨论】:

  • 除了return解析异步函数的promise,你还可以使用throw来拒绝它。
猜你喜欢
  • 2021-07-16
  • 1970-01-01
  • 2017-08-22
  • 2022-01-26
  • 2018-09-07
  • 2018-08-26
相关资源
最近更新 更多