如何使用异步解决此错误?

时间:2018-06-27 18:31:09

标签: javascript node.js asynchronous try-catch

我从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 :(得分:2)

使用更新的代码,我看到的唯一错误是来自未声明的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")) ;