将异步/等待与 util.promisify(fs.readFile) 一起使用?

时间:2021-06-02 00:41:19

标签: node.js

我正在尝试学习 async/await,您的反馈会很有帮助。

我只是将 fs.readFile() 用作尚未使用 Promises 和 async/await 进行现代化改造的函数的具体示例。

(我知道 fs.readFileSync() 但我想了解这些概念。)

下面的模式是否正常?有什么问题吗?

const fs = require('fs');
const util = require('util');

//promisify converts fs.readFile to a Promised version
const readFilePr = util.promisify(fs.readFile); //returns a Promise which can then be used in async await

async function getFileAsync(filename) {
    try {
        const contents = await readFilePr(filename, 'utf-8'); //put the resolved results of readFilePr into contents
        console.log('✔️ ', filename, 'is successfully read: ', contents);
    }
    catch (err){ //if readFilePr returns errors, we catch it here
        console.error('⛔ We could not read', filename)
        console.error('⛔ This is the error: ', err); 
    }
}

getFileAsync('abc.txt');

1 个答案:

答案 0 :(得分:-1)

这里有更多使用 async/await 的方法

已编辑:正如 @jfriend00 在评论中指出的那样,当然您必须使用标准 NodeJS 功能以及 fs.readFile 等内置方法。因此,我将下面代码中的 fs 方法更改为自定义的方法,您可以在其中定义自己的承诺。

// Create your async function manually
const asyncFn = data => {
  // Instead of result, return promise
  return new Promise((resolve, reject) => {
    // Here we have two methods: resolve and reject.
    // To end promise with success, use resolve
    // or reject in opposite
    //
    // Here we do some task that can take time.
    // For example purpose we will emulate it with
    // setTimeout delay of 3 sec.
    setTimeout(() => {
      // After some processing time we done
      // and can resolve promise
      resolve(`Task completed! Result is ${data * data}`);
    }, 3000);
  });
}

// Create function from which we will
// call our asyncFn in chain way
const myFunct = () => {
  console.log(`myFunct: started...`);
  // We will call rf with chain methods
  asyncFn(2)
  // chain error handler
  .catch(error => console.log(error))
  // chain result handler
  .then(data => console.log(`myFunct: log from chain call: ${data}`));
  // Chain call will continue execution
  // here without pause
  console.log(`myFunct: Continue process while chain task still working.`);
}

// Create ASYNC function to use it
// with await
const myFunct2 = async () => {
  console.log(`myFunct2: started...`);
  // Read file and wait for result
  const data = await asyncFn(3);
  // Use your result inline after promise resolved
  console.log(`myFunct2: log from async call: ${data}`);
  console.log(`myFunct2: continue process after async task completed.`);
}

// Run myFunct
myFunct();
myFunct2();