我已经使用 Jasmine 很多年了,现在我正在编写一些代码,这些代码可以使用类似的 done()
概念来实现,以处理 optional 异步参数。我试着挖掘他们的来源,但我不确定 done()
是如何工作的。假设我有这段代码:
new Validator({
element: someElement,
validator: function (value, done) {
doSomeStuffAsyncThenCall(done)
}
});
这是如何运作的?我遇到困难的部分是获取该函数的参数。我可以通过 this.options.validator
获取验证器,但是如果 done
已定义,我该如何获取 和 如何调用它?
最佳答案
我对你的问题的理解如下。你想检测一个函数是否有第二个参数,如果有,做其他事情。所以,你有一个可以传递给函数 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 的问题。
关于javascript - Jasmine 的 `done()` 是怎么实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43930746/