我想以与mocha相同的方式实现可选的异步回调。
我的意思是我想拥有可以同步和异步的回调函数。
当用户使用可选的回调参数' done'当没有回调参数而不是它的同步时,它就是异步。
// Sync version it('does something sync', function() { console.log('this is sync version') }); // Async version it('does something async, function(done) { setTimeout(function() { done(true); }, 1000); });
如何运作'它'区分回调是同步还是异步?
知道如何实现这个吗?
答案 0 :(得分:8)
Mocha仅checks表示测试函数中存在回调参数。 function.length
用于确定回调的参数数量。
答案 1 :(得分:4)
如果您可以假设您的函数的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);