【问题标题】:How to implement mocha like optional async callbacks?如何实现 mocha 之类的可选异步回调?
【发布时间】:2014-06-09 05:08:04
【问题描述】:

我想以与 mocha 相同的方式实现可选的异步回调。

我的意思是我想要一个既可以同步也可以异步的回调函数。

当用户使用可选的回调参数'done'时它是异步的,当没有回调参数时它是同步的。

// 同步版本 it('做一些同步', function() { console.log('这是同步版本') }); // 异步版本 它('做一些异步的事情,函数(完成){ 设置超时(函数(){ 完成(真); }, 1000); });

函数'it'如何区分回调是同步还是异步?

知道如何实现吗?

【问题讨论】:

    标签: javascript node.js mocha.js


    【解决方案1】:

    如果您可以假设您的函数的toString 没有被覆盖,您可以在用户定义的函数上使用它来检查它是否有一个名为done 的参数,例如:

    function argIndexOf(f, arg) {
      var s = f + '';
      return s.substring(s.indexOf('(') + 1, s.indexOf(')'))
        .replace(/\s+/g, '').split(',').indexOf(arg);
    }
    
    argIndexOf(function(){}, 'done'); // -1
    argIndexOf(function(done){}, 'done') // 0
    argIndexOf(function(arg1, done){}, 'done') // 1
    

    该函数将接收一个函数作为参数并返回它的位置 done 参数,或者 -1 如果没有参数。它使用Array.prototype.indexOf,如果您想在 IE 8 或更早版本中使用它,则需要为shimmed。您已将问题标记为 node.js,因此我认为这不是问题。

    您甚至可以将其添加到 Function.prototype 中,但如果您希望您的代码与其他代码很好地配合使用,则非常不鼓励这样做:

    Function.prototype.indexOf = Function.prototype.indexOf || function(arg) {
      var s = this + '';
      return s.substring(s.indexOf('(') + 1, s.indexOf(')'))
        .replace(/\s+/g, '').split(',').indexOf(arg);
    };
    

    那么你可以使用:

    func.indexOf('done')
    

    你也可以使用apply,它会忽略负数索引,所以调用回调并传入一个'done'的值:

    var args = [];
    args[func.indexOf('done')] = done_callback;
    func.apply(func, args);
    

    【讨论】:

    • 非常巧妙的把戏。可能我会坚持这一点。感谢分享!
    • @korCZis 谢谢,没问题 :) @mscdex 的回答是正确的,但 Mocha 并没有测试您的论点是否实际命名为 done,它只是检查是否至少有 1参数,如果 Function.prototype.toString 已被覆盖,它不会中断。
    【解决方案2】:

    Mocha 仅checks 用于测试函数中存在回调参数。 function.length用于判断回调有多少个参数。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2021-01-18
    • 2019-08-03
    • 2013-06-06
    • 2013-06-13
    相关资源
    最近更新 更多