Ожидание не ждет, чтобы прочитать данные из файла? - PullRequest
1 голос
/ 03 ноября 2019

Я пишу следующий код, чтобы прочитать данные из файла и вставить в массив. Но attachments.length сначала печатает 0, а затем данные загружаются и печатаются.

const fs=require('fs');
const util=require('util');
const files=['t1.csv','t2.csv','t3.csv'];
async getdata(){
     const read=util.promisify(fs.readFile);
     let attachments = [];
     async function run(file){
         let data=await read(file);
         attachments.push(data);
     } 
     for(let file of files){
         await run(file);
     }
     console.log(attachments.length);//should print 3
}

Как сначала загрузить данные, а затем правильно нажать.

Редактировать: измените некоторую часть кода, чтобы использовать await. Но прерывание цикла после первой итерации без каких-либо ошибок также не выводит мою attchments.length.

Edit 2: проблема решена. Вызывающую функцию также нужно ждать. Спасибо всем.

Ответы [ 2 ]

3 голосов
/ 03 ноября 2019

Это происходит потому, что в этом случае также следует ожидать run(), см. асинхронная функция

Один из подходов заключается в использовании IIFE :

(async file => {
    let data = await read(file);
    console.log(data);
    attachments.push(data);
})('/home/nadeem/Desktop/test.csv')
1 голос
/ 03 ноября 2019

Когда вы вызываете функцию async, она возвращает обещание, которое в конечном итоге разрешается со значением, возвращаемым функцией (или отклоняется с неперехваченным исключением, выданным из функции).

Итак, вы 'пытаемся записать количество вложений до завершения функции run (). Вот что вам нужно:

run('/home/nadeem/Desktop/test.csv')
  .then(() => console.log(attachments.length))
...