在javascript中链接多个异步方法
我正在编写一个javascript库,将ajax请求抽象到我的HTTP API中。 我的每个javascript函数都是jquery的ajax调用的包装器,它在完成时向用户发出回调 例如 在我想连续执行两次mylib.doFoo的情况下,我有如下代码:在javascript中链接多个异步方法,javascript,jquery,Javascript,Jquery,我正在编写一个javascript库,将ajax请求抽象到我的HTTP API中。 我的每个javascript函数都是jquery的ajax调用的包装器,它在完成时向用户发出回调 例如 在我想连续执行两次mylib.doFoo的情况下,我有如下代码: mylib.doThing( "foo", { success:function(){ mylib.doThing( "bar", { success:function(){alert("done");}); }); 如果超过两个步骤,就会很快
mylib.doThing( "foo", { success:function(){ mylib.doThing( "bar", { success:function(){alert("done");}); });
如果超过两个步骤,就会很快变得一团糟
是否可以提供更简洁的语法,也许更像下面的语法?我需要如何实现mylib.doThing()
如果您只想将未指定数量的成功请求与最终要做的事情联系起来,那么将所有要做的事情列为一个自然列表而不是方法链将更加清晰:
mylib.doThing("foo", "bar", /* all done callback -> */ function() { alert("done") })
doThing
将在工厂中创建嵌套回调,或者更好的是,创建迭代管理器,按顺序运行所有请求,然后调用最终回调。在包装函数本身中,您应该使用.done()
,而不是success
,因为success
将在jQuery的下一个版本中被设置为去擦洗。我如何在没有对固定数量的参数进行硬编码的情况下编写内部工厂?(即,只是复制我的原始代码)@JobyTaffey遍历类似数组的对象。
function doThingFluent(a, b) {
return {
_name : a,
_chainedCall : b,
doMoreThingFluent : function(a1) {
return doThing(a1, this);
},
done : function(callback) {
var chained = this._chainedCall;
var name = this._name;
while (chained) {
callback = function(n, c) {
return function() {
mylib.doThing(n, { success : c });
};
} (name, callback);
name = chained._name;
chained = chained._chainedCall;
}
mylib.doThing(name, {success: callback});
}
};
doThingFluent("foo").doMoreThingFluent("bar").done(function(){alert("done");})
mylib.doThing("foo", "bar", /* all done callback -> */ function() { alert("done") })
function doThingFluent(a, b) {
return {
_name : a,
_chainedCall : b,
doMoreThingFluent : function(a1) {
return doThing(a1, this);
},
done : function(callback) {
var chained = this._chainedCall;
var name = this._name;
while (chained) {
callback = function(n, c) {
return function() {
mylib.doThing(n, { success : c });
};
} (name, callback);
name = chained._name;
chained = chained._chainedCall;
}
mylib.doThing(name, {success: callback});
}
};
doThingFluent("foo").doMoreThingFluent("bar").done(function(){alert("done");})