Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中链接多个异步方法_Javascript_Jquery - Fatal编程技术网

在javascript中链接多个异步方法

在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");}); }); 如果超过两个步骤,就会很快

我正在编写一个javascript库,将ajax请求抽象到我的HTTP API中。 我的每个javascript函数都是jquery的ajax调用的包装器,它在完成时向用户发出回调

例如

在我想连续执行两次mylib.doFoo的情况下,我有如下代码:

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