捕获 Promise 中的错误并拒绝 Promise

Catching Errors Inside Promises and Rejecting Promise

我编写了一个函数,return承诺异步逐行读取文件,但问题是如果文件不存在,则会引发错误并且应用程序崩溃。我已经将代码包围在 try catch 块中,但代码执行从未进入 catch 块而是终止了。

其次,我可以拒绝承诺,然后 return 来自承诺的 json 对象吗?

喜欢reject({success: false});

const fs = require('fs');
const readline = require('readline');

class fileParser{
    readPolicyFile = function(filePath, fileName) {
        return new Promise((resolve, reject) => {
            try {
                let response = {};
                let readInterface = readline.createInterface({
                    input: fs.createReadStream(`${filePath}/${fileName}`),
                    terminal: false
                });
    
                readInterface
                    .on('line', line => {
                        // Do processing here to create the response
                    })
                    .on('close', () => {
                        resolve(response);
                    });
            } catch(err){
                console.log("Inside catach block");
                reject(err);
            }
        })
    }
}


module.exports = new fileParser();

你永远不会看到 Inside catach block 行, 因为 createReadStream 不会像“正常”那样抛出错误。 当它想抛出错误时,它会发出 error 事件。

您需要的是 createReadStream 的句柄 error(不是 readInterface

const fs = require('fs');
const readline = require('readline');

class fileParser {
  readPolicyFile = function (filePath, fileName) {
    return new Promise((resolve, reject) => {
      let response = {};

      // create a stream and handle it's error event
      const stream = fs.createReadStream(`${filePath}/${fileName}`);
      stream.on('error', (error) => {
        reject(error);
        // or reject({success: false}), but why call reject with data
        // If you don't want to handle error of readPolicyFile function, just call resolve({success: false})
      });

      let readInterface = readline.createInterface({
        input: stream,
        terminal: false
      });

      readInterface
        .on('line', line => {
          // Do processing here to create the response
        })
        .on('close', () => {
          resolve(response);
        });
    })
  }
}

module.exports = new fileParser();