我已经开始在最新版本的node中使用async / await进行尝试,并且在尝试等待捕获中的某些内容时遇到了问题。

假设我具有以下功能来检查目录是否存在,如果没有,则根据需要创建文件夹:

const Promise = require("bluebird");
const fs = Promise.promisifyAll(require("fs"));
const path = require("path");

async function ensureDirectoryExists(directory) {
    try {
        console.log("Checking if " + directory + " already exists");
        await fs.openAsync(directory, "r");
    } catch (error) {
        console.log("An error occurred checking if " + directory + " already exists (so it probably doesn't).");
        let parent = path.dirname(directory);

        if (parent !== directory) {
            await ensureDirectoryExists(parent);
        }

        console.log("Creating " + directory);
        await fs.mkdirAsync(directory);
    }
}


如果以以下方式调用它(为它提供一个不存在任何文件夹的目录路径),我将得到预期的输出(“确保该目录存在。”排在最后)。

async function doSomething(fullPath) {
    await ensureDirectoryExists(fullPath);
    console.log("Ensured that the directory exists.");
}


但是,据我了解,每个异步函数都返回一个Promise,因此我认为以下操作也可以:

function doSomething2(fullPath) {
    ensureDirectoryExists(fullPath).then(console.log("Ensured that the directory exists."));
}


但是,在这种情况下,then会在第一次调用fs.openAsync之后立即执行,即使产生错误并且其余代码仍按预期执行。 sureDirectoryExists是否因为实际上没有显式返回任何内容而没有返回承诺?是否由于捕获中的等待而弄乱了所有内容,并且仅在从doSomething调用时才似乎起作用?

最佳答案

您因承诺错误而呼叫.then;它期望一个可以调用console.log的函数:



ensureDirectoryExists(fullPath)
  .then(function() { // <-- note function here
    console.log("Ensured that the directory exists.");
  });


或简写为arrow functions

ensureDirectoryExists(fullPath)
  .then(() => console.log("Ensured that the directory exists."));


如果不将其包装在这样的函数中,则会对console.log(...)进行评估并立即运行(因此它可能会在ensureDirectoryExists完成之前记录下来)。通过提供一个函数,promise可以在异步函数完成后调用此函数。

关于node.js - 在捕获中使用等待的效果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43554088/

10-14 03:12