Как решить эту ошибку с асинхронным? - PullRequest
0 голосов
/ 27 июня 2018

Я запускаю в node.js и пытаюсь использовать try..catch с методами файловой системы. Вот что у меня есть:

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

let buf = new Buffer(1024);

const open = util.promisify(fs.open);
const read = util.promisify(fs.read);
const close = util.promisify(fs.close)

async function main(){
  console.log("Going to open an existing file");
  try{
    const fd = await open('input.txt', 'r+');
    console.log("File opened successfully!");
    console.log("Going to read the file");

    try{
      await read(fd, buf, 0, buf.length, 0);
      if(bytes > 0) 
         console.log(buf.slice(0, bytes).toString());
    }
    catch(e){
      console.log("Error");
   } 
 }
 catch(e){
   console.log("Error");
 }
} 
main();
console.log("Program ended");

Когда я выполняю, он переходит ко второму улову и ничего не печатает.

enter image description here

1 Ответ

0 голосов
/ 27 июня 2018

В вашем обновленном коде единственная ошибка, которую я вижу, связана с необъявленной переменной bytes.

await read(fd, buf, 0, buf.length, 0); вернет значение, которое имеет:

{ 
  buffer: bufferData,
  bytesRead: numberOfBytes
} 

Итак, в вашем асинхронном коде вы должны получить их и использовать их:

try{
  let ret = await read(fd, buf, 0, buf.length, 0);
  if(ret.bytesRead > 0) 
     console.log(buf.slice(0, ret.bytesRead).toString());
}

Конечно, вы также можете просто напечатать буфер, возвращенный из read().

Также будет полезно в блоках catch распечатать ошибки:

catch(e){
  console.log("Error", e);
} 

Кроме того, если вы хотите, чтобы console.log в конце был в нужное время, вы должны использовать что-то вроде:

main().then(() => console.log("Program ended")) ;
...