Node.js 试图理解wait/Async,这是正确的转换吗?
因此,我尝试使用node 8.9.4中的async/await模式重写以下回调函数。我是对的还是应该进一步重写Node.js 试图理解wait/Async,这是正确的转换吗?,node.js,async-await,Node.js,Async Await,因此,我尝试使用node 8.9.4中的async/await模式重写以下回调函数。我是对的还是应该进一步重写 const fs = require("fs"); const makeBackup = (file, callback) => { if(fs.existsSync(`${file}.bak`)) return callback(null, true); fs.copyFile(file, `${file}.bak`, cpErr => {
const fs = require("fs");
const makeBackup = (file, callback) => {
if(fs.existsSync(`${file}.bak`)) return callback(null, true);
fs.copyFile(file, `${file}.bak`, cpErr => {
if(cpErr && cpErr.code === "ENOENT"){
fs.writeFile(`${file}.bak`, Buffer.alloc(0), writeErr => {
if(writeErr) return callback(writeErr);
return callback(null, true);
});
} else if(cpErr) return callback(cpErr);
return callback(null, true);
})
}
下面是我提出的async/await函数
import fs, { copyFile, writeFile } from "fs";
import { promisify } from "util";
const makeBackup = async file => {
// if backup file exists already do nothing further return true.
if (fs.existsSync(`${file}.bak`)) return true;
try {
copyFile = promisify(fs.copyFile);
// if backup file doens't exist copy file to file.bak
await copyFile(file, `${file}.bak`);
// return true when file is copied to bakup file.
return true;
} catch (cpErr) {
// if file missing create an empty backup file
if (cpErr.code === "ENOENT") {
try {
writeFile = promisify(fs.writeFile);
await writeFile(`${file}.bak`, Buffer.alloc(0));
return true;
} catch (writeErr) {
// if error writing to file for any reason return error
return writeErr;
}
}
// if copy error for any other reason return error
return cpErr;
}
我会把它分成两个函数。它更容易阅读,而且try/catch更少 我自己的规则是,当我看到嵌套的try/catch或嵌套的数组函数时,这意味着您必须创建单独的函数
async makeBackup(file) {
// if backup file exists already do nothing further return true.
if (fs.existsSync(`${file}.bak`)) return true;
try {
copyFile = promisify(fs.copyFile);
// if backup file doens't exist copy file to file.bak
await copyFile(file, `${file}.bak`);
// return true when file is copied to bakup file.
return true;
} catch (cpErr) {
// if file missing create an empty backup file
if (cpErr && cpErr.code === "ENOENT") {
return createEmptyBackupFile(file);
}
// if copy error for any other reason return error
return cpErr;
}
}
async createEmptyBackupFile(file) {
writeFile = promisify(fs.writeFile);
// if error writing to file for any reason it will throw an error
await writeFile(`${file}.bak`, Buffer.alloc(0));
return true;
}
即使您在CreateEmptyBackupFile中返回一个硬true,但如果写入错误被清除,它仍将返回一个错误?当承诺中发生错误时,错误将被抛出。这意味着在抛出错误和捕获错误之间的任何代码都不会被执行。在这种情况下,错误将被抛出writeFile内部。因为createEmptyBackFile中没有捕获,所以在调用函数(makeBackup)时会抛出错误。然后,因为makeBackup中的createEmptyBackupFile调用没有try/catch,所以makeBackup将被抛出调用函数(…)…等,直到它达到try/catch,这是一个关于异步/wait的教程。有一个部分错误处理,你应该看看它