Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 试图理解wait/Async,这是正确的转换吗?_Node.js_Async Await - Fatal编程技术网

Node.js 试图理解wait/Async,这是正确的转换吗?

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 => {

因此,我尝试使用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 => {
        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的教程。有一个部分错误处理,你应该看看它