如何在不链接“.done()”的情况下处理多个依赖的异步AJAX调用?

时间:2016-01-20 15:03:40

标签: javascript jquery ajax asynchronous

我正在尝试构建可重用的JavaScript对象来执行某些任务:

Service = {
  getSomeID : function() {
    // Get the ID from AJAX call
    // or from cookie if AJAX fails
    // or from URL parameter if no cookie
  },

  doSomeRequest : function(url) {
    var id = this.getSomeId();

    jQuery.getJSON(url + id, function(data)) {
       // Do some really important stuff.
    });
  },

  doSomeWork : function() {
    this.doSomeRequest(this.getUrl());
  },

  getUrl : function() {
    return 'http://example.com/';
  }
};

Service.doSomeWork();

如您所见,doSomeRequest()函数需要获取getSomeId()函数提供的ID。此功能的问题是呼叫者应该只接收ID。不是承诺,因为ID可以是来自不同地方的红色。因此技术上getSomeID()是同步呼叫的完美候选者。太糟糕了,因为:

  

从jQuery 1.8开始,不推荐使用async:false和jqXHR($ .Deferred);您必须使用success / error / complete回调选项而不是jqXHR对象的相应方法,例如jqXHR.done()或不推荐使用的jqXHR.success()。

所以我们的目标是让函数只提供真实的信息,而不是延期的promises,这样这些返回值就可以安全地用在其他函数调用中。

我想避免一些事情:

  1. 避免将回调传递给getSomeId()函数 将用于调用另一个jQuery.getJSON(),因为它会 意味着我还必须通过网址。这变得简单 getSomeId()函数进入 我不想要getSomeIdThenInvokeCallbackWithParameter(callback, parameter)函数,因为getSomeId()在不同的上下文中可用,而不是所有函数都涉及进行AJAX调用。

  2. 避免多次链接.done().done().done() 这就破坏了单独使用单独功能的目的 逻辑片段,不允许我重复使用代码。

0 个答案:

没有答案