如何像可选的asynchronouscallback实现摩卡?

我想实现可选的asynchronouscallback与摩卡一样。

我的意思是我想要有可以是同步和asynchronous的callback函数。

当用户使用可选的callback参数“完成”时,它是asynchronous的,当没有callback参数比同步。

 //同步版本
它('做一些同步',function(){ 
   console.log('这是同步版本') 
 });

 //asynchronous版本
它('做一些asynchronous,function(完成){
   setTimeout(function(){
    完成(真);
   },1000);
 });

怎样才能区分callback是同步还是asynchronous呢?

任何想法如何实现这一点?

如果你可以假设你的函数的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或更早版本中使用它,则需要将其擦亮 。 你已经标记了问题node.js ,所以我会认为这不是一个问题。

你甚至可以把它添加到Function.prototype中,尽pipe如果你想让你的代码和其他人一起玩的话,

 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 ,它会忽略负数索引,所以调用callback函数并传递一个值为'done':

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

摩卡只检查testing函数中是否存在callback参数。 function.length用于确定callback有多less个参数。