有一个函数需要调用不确定数量的其他(可能异步)函数,每个函数都带有回调,我使用以下模式。
虽然很确定它是正确的,但在美学上不太令人愉悦。
// fn responsible for figuring out and calling aysnc funcs
function fn( arg, outNext ) {
// calculate how many funcs we will be calling
var waitCt = 0;
var a, b, c;
if( a = arg['a'] ) waitCt++;
if( b = arg['b'] ) waitCt++;
if( c = arg['c'] ) waitCt++;
// call funcs
if( a ) fnArbitrary( arg.a, inNext );
if( b ) fnRandom( arg, inNext );
if( c ) fnClueless( 15, inNext );
// calback func
function inNext( err ) {
// wait for one less func
waitCt--;
// return err if found
if( err ) outNext( err );
// return nada if all funcs performed
if( waitCt == 0 ) outNext();
// otherwise we're waiting for other funcs to finish
return;
}
}
对我来说,似乎有必要采取两个步骤:第一步查看将调用多少个函数,第二步进行调用。但也许我的大脑因老式编程或昨晚读了太多《李尔王》而变得混乱。
我见过的多个异步函数的最佳管理理念是延迟和功能描述在这篇脚本迷文章中 http://msdn.microsoft.com/en-us/scriptjunkie/gg723713, 这篇关于 FutureJS 实现的文章 http://coolaj86.info/futures/, 这篇 MSDN 文章 http://blogs.msdn.com/b/rbuckton/archive/2010/01/29/promises-and-futures-in-javascript.aspx和这个堆栈溢出问题 https://stackoverflow.com/questions/3249646/client-side-javascript-to-support-promises-futures-etc.
它实际上是一种思考对多个异步调用进行排序或定义它们之间的执行依赖关系的结构化方法,并且它似乎对不同框架的多个正在进行的实现(已经可用)具有吸引力,因此它似乎是一个普遍支持的想法,对于学习这两种方法都很有用现在和将来。
手动管理多个异步调用及其之间的依赖关系确实很混乱。代码不仅看起来很乱,而且无法阅读,更无法使用调试器。调试通常需要将大量信息转储到日志文件中,然后尝试找出发生的情况。如果涉及到时间,那么你就真的陷入困境了。在我的上一个项目中,我仍然有未解决的错误的唯一区域是启动时四个不同的异步调用之间缺少某种依赖关系。我已经强化了代码以使其几乎不会发生错误,但它还没有完全消失。下一步是改用 deferreds 并为其添加一些正式的结构。
至于一些较大的图书馆,我们有jQuery 延迟 http://api.jquery.com/category/deferred-object/,YUI3有异步队列 http://developer.yahoo.com/yui/3/async-queue/(它的功能不如一般的 deferreds,但很有用),Dojo 有一个延迟对象 http://dojotoolkit.org/api/1.3/dojo/Deferred还有一些不与主库绑定的延迟库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)