【问题标题】:Catching Errors Inside Promises and Rejecting Promise [duplicate]在 Promise 中捕获错误并拒绝 Promise [重复]
【发布时间】:2021-04-21 21:36:14
【问题描述】:

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

其次,我可以拒绝一个承诺,然后从承诺中返回一个 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();

【问题讨论】:

  • 您需要处理该流上的error 事件。不要将代码包装在try/catch
  • 感谢@Bergi 和@evolutionxbox,我实际上是在readInterface 中处理它,但它需要在fs 读取流中处理。这对我有用。

标签: javascript node.js es6-promise


【解决方案1】:

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

您需要处理errorcreateReadStream(不是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();

【讨论】:

  • 谢谢@hoangdv,这是一个很好的观点,我不需要拒绝承诺,因为我不想处理错误而只是返回错误响应。
猜你喜欢
  • 2019-01-04
  • 2019-03-10
  • 1970-01-01
  • 2017-02-05
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 2015-07-21
相关资源
最近更新 更多