在javascript中链接多个异步方法

Chaining multiple asynchronous methods in javascript

本文关键字:异步方法 链接 javascript      更新时间:2023-09-26

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

doThing将在一个工厂内创建嵌套回调,或者更好的是,创建迭代管理器,按顺序运行所有请求,然后调用最终回调。