1

我正在编写一个 javascript 库来抽象对我的 HTTP API 的 ajax 请求。我的每个 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");
4

2 回答 2

1

如果您只想将未指定数量的成功请求链接到最后做某事,将所有要做的事情列为自然列表而不是方法链会更清晰:

mylib.doThing("foo", "bar", /* all done callback -> */ function() { alert("done") })

doThing将在工厂内部创建嵌套回调或 - 甚至更好 - 迭代管理器,该管理器将按顺序运行所有请求,然后调用最终回调。

于 2012-07-11T12:19:20.910 回答
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");})
于 2012-07-11T12:20:58.220 回答