可以Node.js"内置"流发出多个错误?

时间:2016-06-18 18:19:04

标签: javascript node.js

如果我收到stream.Readablestream.Writable,例如在致电http.IncomingMessagefs.ReadStreamfs.WriteStream后,我应该假设全部< / em>事件可能会多次触发,除非文档另有说明?

我对这些问题的答案特别感兴趣:

  1. error事件可以多次触发吗?
  2. 如果发出error事件,还会发生哪些其他事件? (例如data?)
  3. 问题假设:

    • error事件已被抓住且无法投掷。
    • 未使用第三方库。

    代码示例

    var options = {
      method: 'GET',
      host: 'localhost',
      path: '/',
    };
    
    require('http').get(options, function(response) {
      // ...
    
      response.on('end', callback);
      response.on('error', callback);
    
      // ...
    });
    
    function callback() {
      // Can this function be called multiple times?
    }
    
    var s = require('fs').createReadStream('/path/to/file');
    
    s.on('end', callback);
    s.on('error', callback);
    
    function callback() {
      // Can this function be called multiple times?
    }
    
    var s = require('fs').createWriteStream('/path/to/file');
    
    s.on('finish', callback);
    s.on('error', callback);
    
    function callback() {
      // Can this function be called multiple times?
    }
    

1 个答案:

答案 0 :(得分:1)

简短回答:是的。

答案很长:Yyyeeesss。

开玩笑......正如文档所说,The stream is not closed when the 'error' event is emitted,所以是的,因为流在​​收到错误后实际上是打开的,其他一切仍然可以发生。因此,在收到错误后,您仍然会收到它可以发送的finishendwhatever事件。

通常在发生错误后调用end事件,因为错误通常是无法读取/写入更多数据等,但不要将此作为规则假设为您的程序需要为每种情况做好准备。

如果您希望程序在100%的错误发生错误后停止读/写,则必须致电.end()以确保结束。