在下面的代码中不能在数组上使用 for
循环,因为每个步骤都是非阻塞的并且需要回调函数
操作原理:表单提交调用 verify()
,其中 el
是HTMLFormElement, nextFunc
是回调函数 . 表单中包含的每个元素都使用 verifyCol()
进行验证,在返回的第一个错误中突破为 nextFunc(err)
,或者在完成时突破到 nextFunc()
.
// verify as called from post
Post.prototype.verify = function( el, nextFunc ) {
var post = this;
var arr = this.entryArr(el);
(function verifyOne( i ) {
if( i >= arr.length ) nextFunc();
else post.colVerify( arr[i], function(err) {
if( err ) nextFunc( err );
else verifyOne( i+1 );
} );
})(0);
}
这种方法对我来说很有意义(尽管可疑看起来像Lisp) .
这是正确的范例吗?递归调用回调函数是否有任何危险?
1 回答
JavaScript is a lisp variant(来自scheme的后代),这就是它看起来像lisp的原因 .
如果
post
函数是来自HTTP请求的回调函数,则上面的代码中没有递归(在最严格的递归定义中) - 函数只是句柄,它们作为引用保存,并在HTTP发布时通过事件队列调用返回数据 .递归是否可以在JavaScript中用于循环递归取决于JavaScript解释器实现了什么tail-call-optimization但是大多数JavaScript实现(如果你知道的话添加一个注释)没有实现,所以通常循环递归(即调用函数)如果调用堆栈变得太深,可能会导致问题,而不会将调用放在事件队列上 .
在您的情况下,从上一次调用返回帖子之前,从不调用verifyOne调用,因此您的循环通过事件队列
程序范例看起来很好,对我来说就像教科书一样 .