Javascript 如何';茉莉花';完成了吗?

Javascript 如何';茉莉花';完成了吗?,javascript,asynchronous,Javascript,Asynchronous,我已经使用Jasmine多年了,现在我正在编写一些代码,这些代码可以使用类似的done()概念来实现,用于处理可选的异步参数。我试着挖掘他们的源代码,但我不确定done()是如何工作的。假设我有这个代码: new Validator({ element: someElement, validator: function (value, done) { doSomeStuffAsyncThenCall(done) } }); 这是怎么回事?我遇到麻烦的部分

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

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

这是怎么回事?我遇到麻烦的部分是获取该函数的参数。我可以使用,比如说,
this.options.validator
获取验证器,但是如果定义了
done
,我该如何获取它?我理解您的问题如下。您希望检测函数是否有第二个参数,如果有,请执行其他操作。因此,您有一个可以传递给函数Y的函数X。如果Y有两个参数,那么您希望以函数Z作为第二个参数异步调用Y,并等待调用Z,否则您只需等待Y返回,然后继续

给定一个函数Y,您可以确定它有多少个参数。这可以用于具有不同的代码路径,如下所示

函数X(Y){
if(类型(Y)!=‘功能’){
抛出新错误('参数应为函数');
}
如果(Y.length==2){
//异步调用Y
setTimeout(函数(){
Y('foo',function(){
console.log('Y现在完成(1)!');
});
}, 10);
}否则{
Y(“酒吧”);
console.log('Y现在完成(2)!');
}
}
X(函数(arg,done){console.log('Y('+arg+'));done();});

X(函数(arg){console.log('Y('+arg+'));})@zerkms你能详细解释一下吗?“我碰到的问题是获取该函数的参数”。你到底想要什么?您可以通过
length
获得函数的arity,并使用它,假设存在第二个参数总是表示异步行为。您还可以使用
toString
并从stringized函数中解析所需的值。@我在问题中提到的zerkms:“我试图挖掘它们的源…”。例如,这就是它们捕获持续时间过长的异步调用的方式
Function.prototype.apply.apply
。这是大量的伪代码,我不确定它是如何工作的。这是一个附加了
done()
测试的文件,我认为问题在于OP无法控制函数本身,因此他们无法检查参数的类型。代码的使用者将编写函数,OP需要知道使用者是否提供了一个带有2个参数的函数。@jamesalardice啊,我现在明白了,这个问题也可以这样理解。所以OP想知道一个
函数
是否会对它的第二个参数做任何事情,是吗?听起来不可能。。。我会保持我的回答,看看OP对此是否有评论。不,我想他们只需要知道它是否有第二个参数,而不是它是否有任何作用。这就是像Jasmine这样的工具所做的——你把一个测试作为一个函数来编写,如果你在这个函数中添加第二个参数,Jasmine将异步处理这个测试,并等待你调用第二个参数(这将是一个回调函数),然后再进行下一个测试。我想允许人们添加额外的验证。我的代码需要使用它们的
验证器
函数。如果第二个参数存在,我希望使验证器异步,并且在调用
done
之前不会“完成”。这个博客解释了Jasmine是如何工作的也值得一提,这是Jasmine有自己的内部单元测试的文件,用于
done
,但我在这里没有找到done是如何工作的