javascript - Jasmine 的 `done()` 是怎么实现的?

标签 javascript asynchronous

我已经使用 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/

相关文章:

javascript - 如何遍历 DocumentFragment 的 child ?

javascript - 如何始终使 IE 10 和 11 崩溃?正在复制 "Internet Explorer to close and reopen the tab"

javascript - 如何使用 JavaScript 离线读取 JSON 文件?

javascript - 对象定义中的箭头函数

javascript - 使用 jQuery.Deferred 自定义 JS 确认模态以及基于按钮的返回值问题

c# - 自定义TaskFactory不使用自定义SynchronizationContext

javascript - 导航栏消失

c# - 将异步编程模型(开始/结束方法)转换为基于事件的异步模型?

Flutter,在一定时间内实现一个方法

c# - 如何进行惰性注入(inject)的异步初始化