簡體   English   中英

我怎么能對那個 function 使用異步/等待?

[英]how could I use async/await for that function?

我正在嘗試讀取 some.txt 文件和 console.log 一個 object 以及之后的格式化數據,但是我知道如何使用 async/await 來做到這一點。 我試過了,但后來得到了錯誤“ SyntaxError: Unexpected reserved word

let parse = async(num) =>{
    let files = ['p.txt', 'q.txt', 'r.txt', 's.txt', 't.txt', 'u.txt', 'v.txt', 'w.txt', 'x.txt', 'z.txt'];
        fs.readFile('./data txt/' + files[num], 'utf8', (err, data) => {
            if(err){
                console.log(err)
            }
            await test(obj, 'data', data) 
        });
};


parse(0); // need to end so that console.log() catch the new obj 
console.log(obj)

您的嵌套回調不是async的(注意:以下代碼段僅說明了此特定問題的解決方案,但完整的解決方案將在下面):

let parse = (num) =>{
    let files = ['p.txt', 'q.txt', 'r.txt', 's.txt', 't.txt', 'u.txt', 'v.txt', 'w.txt', 'x.txt', 'z.txt'];
        fs.readFile('./data txt/' + files[num], 'utf8', async (err, data) => {
            if(err){
                console.log(err)
            }
            await test(obj, 'data', data) 
        });
};

這就是你得到SyntaxError的原因。

為了使整個 function async ,您必須擺脫回調樣式fs.readFile() 您可以使用fs.promises (我認為從 Node 10 開始可用):

let parse = async (num) =>{
    let files = ['p.txt', 'q.txt', 'r.txt', 's.txt', 't.txt', 'u.txt', 'v.txt', 'w.txt', 'x.txt', 'z.txt'];
    try {
      const data = await fs.promises.readFile('./data txt/' + files[num], 'utf8')
      return await test(obj, 'data', data) 
    } catch (err) {
      console.log(err);
    }
};

或者如果你不能使用這個新的 API,你可以使用util.promisify()

const readFileAsync = require('util').promisify(fs.readFile);
let parse = async (num) =>{
    let files = ['p.txt', 'q.txt', 'r.txt', 's.txt', 't.txt', 'u.txt', 'v.txt', 'w.txt', 'x.txt', 'z.txt'];
    try {
      const data = await readFileAsync('./data txt/' + files[num], 'utf8')
      return await test(obj, 'data', data) 
    } catch (err) {
      console.log(err);
    }
};

或者,如果您覺得精明(不要),您可以自己承諾 function 並使用原始Promise

let parse = (num) => new Promise((resolve, reject) => {
    let files = ['p.txt', 'q.txt', 'r.txt', 's.txt', 't.txt', 'u.txt', 'v.txt', 'w.txt', 'x.txt', 'z.txt'];
        fs.readFile('./data txt/' + files[num], 'utf8', (err, data) => {
            if(err){
                console.log(err)
            }
            resolve(test(obj, 'data', data));
        });
});

您可以將Promise fs.readFile ,然后resolvereject結果。

將對parse()的調用包裝在匿名異步 function 中,以便能夠使用await

const parse = async (num) => {
  let files = ['p.txt', 'q.txt', 'r.txt', 's.txt', 't.txt', 'u.txt', 'v.txt', 'w.txt', 'x.txt', 'z.txt'];
  return new Promise((resolve, reject) => {
    fs.readFile('./data txt/' + files[num], 'utf8', (err, data) => {
      if (err) {
        return reject(err);
      }
      return resolve(test(obj, 'data', data));
    });
  })
};

(async function() {
  const obj = await parse(0); // need to end so that console.log() catch the new obj 
  console.log(obj)
}());

/* 
// using thenables
parse(0).then((obj) => console.log(obj));
*/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM