Jasmine的`done()`是如何实现的?

时间:2017-05-12 06:30:03

标签: javascript asynchronous

我已经使用Jasmine多年了,我现在正在编写一些代码,可以使用类似的done()概念来实现处理可选异步参数。我尝试挖掘他们的来源,但我不确定done()是如何工作的。说我有这段代码:

new Validator({
    element: someElement,
    validator: function (value, done) {
        doSomeStuffAsyncThenCall(done)
    }
});

这是如何工作的?我正在碰壁的部分是获得该功能的参数。我可以使用this.options.validator来获取验证器,但如果done被定义并且我该怎么称呼它,我该怎么办?

1 个答案:

答案 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的问题。