Javascript 如何在不链接的情况下处理多个相关的异步AJAX调用;。完成();?

Javascript 如何在不链接的情况下处理多个相关的异步AJAX调用;。完成();?,javascript,jquery,ajax,asynchronous,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();

我试图构建可重用的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()
是同步调用的完美候选。太糟糕了,因为:

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

因此,我们的目标是让函数只提供真实的信息,而不是延迟的承诺,这样这些返回值就可以安全地用于其他函数调用

我想避免几件事:

  • 避免将回调传递给 将用于调用另一个
    jQuery.getJSON()
    ,因为它将 这意味着我还必须传递url。这就变得简单了
    getSomeId()
    函数
    getSomeId theinvokeCallbackWithParameter(callback,parameter)
    函数,我不想要它,因为
    getSomeId()
    可以在不同的上下文中使用,并且不是所有的上下文都涉及到AJAX调用

  • 避免多次链接
    .done().done().done()
    这违背了为单独的用户提供单独功能的目的 一段逻辑,不允许我重用代码


  • getSomeID()
    可以返回一个延迟对象,您可以按照自己的意愿解析该对象,然后使用
    this.getSomeID().done(函数(id){jQuery.getJSON(url+id,函数(data)){//做一些非常重要的事情。});})我的意思是:@A.Wolff我不会说我喜欢这个,但如果你把你的JS小提琴变成一个答案,我想我会接受的。虽然不推荐使用同步调用确实令人恼火。必须管理长链的
    .done().done().done()
    真的很烦人,我看不出嵌套AJAX调用不能同步的原因。谢谢大家,这将使我以更好的方式编写下一个项目。
    getSomeID()
    可以返回一个延迟对象,您可以根据需要解析该对象,然后使用
    this.getSomeId().done(函数(id){jQuery.getJSON(url+id,函数(数据)){//Do一些非常重要的东西。});})我的意思是:@A.Wolff我不会说我喜欢这个,但如果你把你的JS小提琴变成一个答案,我想我会接受的。虽然不推荐使用同步调用确实令人恼火。必须管理长链的
    .done().done().done()
    真的很烦人,我不明白嵌套AJAX调用不能同步的原因。谢谢大家,这将使我以更好的方式编写下一个项目。