在javascript中链接多个异步方法

时间:2012-07-11 12:09:32

标签: javascript jquery

我正在编写一个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");

2 个答案:

答案 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");})