我已经开始在最新版本的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/