Ожидание результатов асинхронной функции undefined

У меня проблемы с async / await с Node. Когда я пробую это:

function Read_Json_File() {
   fs.readFile('import.json','utf-8',(err, data) => {  
       if (err) throw err;
       json_data = JSON.parse(data);

       return json_data;

   });
}

async function run_demo() {
    let get_json_file = await Read_Json_File();
    console.log(get_json_file);
}

run_demo();

Он возвращает undefined вместо JSON из файла. Почему не дожидается окончания чтения файла?


person Community    schedule 13.12.2017    source источник


Ответы (3)


Вы ничего не возвращаете из Read_Json_File, поэтому вы получаете undefined - вы возвращаете данные из обратного вызова, который ни к чему не приводит. Вместо этого, чтобы использовать async / await, вам нужно будет обещать fs.readFile, поскольку это еще не сделано. Тогда вы сможете использовать async / await:

function readJSONFile() {
  return new Promise((resolve, reject) => {
    fs.readFile('import.json', 'utf-8', (err, data) => { 
      if (err) reject(err);
      resolve(JSON.parse(data));
    });
  });
}

Await требует фактического обещания, которого нужно ждать. Это возвращает обещание использовать ожидание. Таким образом, мы ждем, пока не вызовем resolve - что произойдет, когда мы закончим загрузку JSON:

let json = await readJSONFile();
console.log(json);

Здесь мы называем readJSONFile. Это возвращает обещание, которое разрешается, когда файл JSON завершает загрузку, и позволяет, казалось бы, синхронное выполнение асинхронного кода.

person Andrew Li    schedule 13.12.2017
comment
да, теперь это работает как мечта, спасибо, но я слышал, что могу использовать async / await без использования Promise. это правда? - person ; 13.12.2017
comment
@OFSTTP Await ожидает обещания. Async / await - это просто синтаксический сахар для обещаний. После того, как вы все усвоите, async / await - это просто обещания - вы не можете просто выполнять асинхронный код синхронно. В какой-то степени вам всегда придется использовать обещания, а функции async / await в конечном итоге станут больше обещаниями и потомками. - person Andrew Li; 13.12.2017
comment

Вы пропустили обещание решить и отклонить.

Используйте как показано ниже.

function Read_Json_File() {
    return new Promise((resolve,reject)=> {
           fs.readFile('import.json','utf-8',(err, data) => {  
               if (err) reject(err);
               json_data = JSON.parse(data);

               resolve(json_data);

           });
    }
});
person sungyong    schedule 13.12.2017

попытайся:

      function Read_Json_File() {
          return new Promise(resolve,reject => {
            fs.readFile('import.json','utf-8',(err, data) => {  
              if (err) reject(err);
                json_data = JSON.parse(data);

              resolve(json_data);
           });

   }
person Frederick Pham    schedule 13.12.2017
comment
Это точная копия двух предыдущих ответов, на этот раз с плохим отступом и без пояснительного текста. - person Chris G; 13.12.2017