我正在尝试写入文件。某些文件将被写入错误的路径。对于每个文件,我需要 1.登录到开始写入的控制台。 2.写入文件 3A如果完成写入,则登录到控制台完成。 3B如果路径错误,请登录控制台,确认文件失败
现在,如果失败,则将两者都写入控制台。
我尝试嵌套.thens,我尝试仅回呼。
async function beginWrite(filename){
console.log(`Creating file ${filename}`)
}
async function writeComplete(filename){
console.log(`Finished creating file ${filename}`)
}
async function writeFile(path, filename){
fs.writeFile(path + '/' + filename, 'this is a file', (error) => {
if(error) {console.log(`File ${filename} failed to write`)}
});
}
async function logAndWrite(path, filename){
beginWrite(filename)
.then( () => {
writeFile(path, filename)
}
)
.then(writeComplete(filename))
.catch( (e) => {
return console.log(`File ${filename} failed to write`)
})
}
我希望
文件1写入 文件1完成 文件2写 文件2写入失败 文件3写作 文件3完成
答案 0 :(得分:0)
您不能简单地在函数声明上撒上async
并希望魔术发生。
async
是应对承诺的一种方式。它要求您在异步函数内部await
{Promise},这反过来又要求您实际上拥有一个返回Promise的函数。您什么都不做。
首先,您需要一个返回Promise的函数。 Node的本机异步函数使用回调并且不返回任何内容,因此,如果要使用本机fs.writeFile()
并返回Promise,则需要制作包装函数。此过程称为“承诺”,当手动完成时,它看起来像这样:
function writeFileAsync(file, data){
return new Promise(resolve => {
fs.writeFile(file, data, err => {
if (err) throw err; else resolve();
})
});
}
Node还具有实用程序,可对任何节点样式的异步功能(util.promisify(original)
)一步完成相同的操作。
const writeFileAsync = util.promisify(fs.writeFile);
现在我们可以await
进行操作了,我们可以制作一个async
来等待它的功能(请注意,您绝对需要 try / catch块):< / p>
async function test() {
try {
let filename = 'some/file';
console.log(`Creating file ${filename}`)
await writeFileAsync(filename, 'this is a file');
console.log(`Finished creating file ${filename}`)
} catch (err) {
console.log(`File ${filename} failed to write`);
console.log(err);
}
}
或者我们可以将其与Promises的等效常规.then()
和.catch()
语义结合使用:
let filename = 'some/file';
console.log(`Creating file ${filename}`);
writeFileAsync(filename, 'this is a file')
.then(() => {
console.log(`Finished creating file ${filename}`
})
.catch((err) => {
console.log(`File ${filename} failed to write`);
console.log(err);
});