如何像可选的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个参数。