我已经使用Jasmine多年了,我现在正在编写一些代码,可以使用类似的done()
概念来实现处理可选异步参数。我尝试挖掘他们的来源,但我不确定done()
是如何工作的。说我有这段代码:
new Validator({
element: someElement,
validator: function (value, done) {
doSomeStuffAsyncThenCall(done)
}
});
这是如何工作的?我正在碰壁的部分是获得该功能的参数。我可以使用this.options.validator
来获取验证器,但如果done
被定义并且我该怎么称呼它,我该怎么办?
答案 0 :(得分:1)
我理解你的问题如下。您想要检测某个函数是否有第二个参数,如果是,请执行其他操作。所以,你有一个可以传递函数Y的函数X.如果Y有两个参数,那么你想用函数Z作为第二个参数异步调用Y并等待Z被调用,否则你只是等到Y返回然后继续。
给定函数Y,您可以使用Function.length
确定它有多少个参数。这可以用于具有不同的代码路径,如下所示。
function X(Y) {
if (typeof(Y) !== 'function') {
throw new Error('argument should be a function');
}
if (Y.length === 2) {
// asynchronously call Y
setTimeout(function() {
Y('foo', function() {
console.log('Y is done now (1)!');
});
}, 10);
} else {
Y('bar');
console.log('Y is done now (2)!');
}
}
X(function(arg, done) { console.log('Y(' + arg + ')'); done(); });
X(function(arg) { console.log('Y(' + arg + ')'); });
感谢James Allardice helping me改进了这个答案并理解了OP的问题。