错误时双回调

时间:2014-02-19 17:23:57

标签: mocha stylus

当测试手写笔和断言抛出时,它会再次使用Assertion错误调用回调:

var expect = require('chai').expect,
    stylus = require('stylus'),
    i = 0

describe('test stylus', function(){
    it('calls back', function(done){
        stylus('p\n\tcolor white').render(function(err,css){
            i++;
            console.log('callback', i) //logs twice
            expect(css).equal('p\n\t{ color: bad;\n}')
            done()
        })
    })
}) 

我正在使用它来解决这个问题:

describe('test stylus', function(){
    it('calls back', function(done){
        stylus('p\n\tcolor white').render(function(err,css){
            try {
                expect(css).equal('p\n\t{ color: bad;\n}')
            } catch(e) {
                done(e)
            }   
        })
    })
})

我认为重新调用回调是一个手写笔错误。或者我在这里遗漏了什么?

1 个答案:

答案 0 :(得分:0)

您的假设是正确的。以下是手写笔中的code

Renderer.prototype.render = function(fn){

  // ...

  try {

    // ...

    var listeners = this.listeners('end');
    if (fn) listeners.push(fn);
    for (var i = 0, len = listeners.length; i < len; i++) {
      var ret = listeners[i](null, css); // Called here once.
      if (ret) css = ret;
    }
    if (!fn) return css;
  } catch (err) {
    var options = {};
    options.input = err.input || this.str;
    options.filename = err.filename || this.options.filename;
    options.lineno = err.lineno || parser.lexer.lineno;
    if (!fn) throw utils.formatException(err, options);
    // Called here a second time if there is an exception.
    fn(utils.formatException(err, options));
  }
};

fn是回调。它被添加到listeners,并将作为调用所有侦听器的循环的一部分调用一次。如果回调在那里引发异常,那么它将再次被称为 ,作为异常处理的一部分。