我正在编写一个javascript库来抽象ajax请求到我的HTTP API。 我的每个javascript函数都是jquery的ajax调用的包装器,它在完成时对用户进行回调。
例如
mylib.doThing( "foo", { success:function(){alert("done");});
如果我想连续两次执行mylib.doFoo,我有类似的东西:
mylib.doThing( "foo", { success:function(){ mylib.doThing( "bar", { success:function(){alert("done");}); });
对于更多这两个步骤,这很快就会变得混乱。
是否可以提供更清晰的语法,或许更像下面的内容?我将如何实施mylib.doThing()
?
mylib.doThing("foo").mylib.doThing("bar").alert("done");
答案 0 :(得分:1)
如果您只是想通过最终做某事来链接未指定数量的成功请求,那么将所有要做的事情列为自然列表而不是方法链将更加清晰:
mylib.doThing("foo", "bar", /* all done callback -> */ function() { alert("done") })
doThing
将在工厂内部创建嵌套回调或 - 甚至更好 - 迭代管理器,它按顺序运行所有请求,然后调用最终回调。
答案 1 :(得分:1)
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");})