如何使用 util promisify 使用异步等待?

Pra*_*ase 7 asynchronous node.js promise

我想对fs.accessand使用 async-await fs.unlink。两个函数都返回一个没有结果回调的错误。所以问题是如果函数抛出错误,它会直接转到 catch 块并继续进行下一次迭代。

const unlink = util.promisify(fs.unlink);
const access = util.promisify(fs.access);

const deleteAssetsCtrl = async (req, res) => {
    try {
        let iteration = 0;
        for (let file of fileUrls) {
            const fileUrl = file.fileUrl
            const fileLocation = path.resolve(contentFolderPath, fileUrl);
            access(fileLocation); // step 1
            unlink(fileLocation); // step 2
            const deleteRowQuery = `DELETE FROM table WHERE fileUrl = '${fileUrl}'`;
            executeQuery(deleteRowQuery); // step 3

        if (fileUrls.length == iteration){
            res.send("true");
        } else {
            res.send('false')
        }           
    } catch (error) {
        console.log('Error =>', error);
        res.send(error);
    }
}
Run Code Online (Sandbox Code Playgroud)
Error => Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
Run Code Online (Sandbox Code Playgroud)

如何控制流量。(步骤要按顺序)

Tha*_*guy 5

您需要await在每个异步函数上添加注释(基本上,所有返回承诺的东西)

const unlink = util.promisify(fs.unlink);
const access = util.promisify(fs.access);

const deleteAssetsCtrl = async (req, res) => {
    try {
        let iteration = 0;
        for (let file of fileUrls) {
            const fileUrl = file.fileUrl
            const fileLocation = path.resolve(contentFolderPath, fileUrl);
            await access(fileLocation); // step 1
            await unlink(fileLocation); // step 2
            const deleteRowQuery = `DELETE FROM table WHERE fileUrl = '${fileUrl}'`;
            executeQuery(deleteRowQuery); // step 3

        if (fileUrls.length == iteration){
            res.send("true");
        } else {
            res.send('false')
        }           
    } catch (error) {
        console.log('Error =>', error);
        res.send(error);
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着您使用Promiseutil.promisify或任何其他方法包装在 Promise 中的所有内容都会创建一个您可以使用的异步函数await

如果您需要从函数本身返回的值,如果您使用await该函数,您将只能访问返回值的内容,因为没有该关键字,节点将继续执行并且不会等待该值返回或异步函数在继续之前完成。