2012-11-06 125 views
0

我现在正在jQuery中进行同步AJAX调用。是否有任何方法让父函数在保持异步调用的同时返回Ajax响应。我能找到的唯一解决方案是使用回拨功能。我不想写一个回调函数,因为我打算把这个对象放在一个变量中。jQuery延迟Ajax调用和返回Ajax响应

例如

var ajax = serviceinterface.rawServiceCall(“http://user.myservice.com/endpoint”, “post”, {name : “xyz”}); 

我可能还需要使用这样的

$.when(serviceinterface.rawServiceCall(endpoint1, “get”), serviceinterface.rawSCACall(endpoint2, ‘get’)).done(function(){ 
    // do something here 
}); 

这里是我的功能码,同步调用工作绝对没问题,但我想打一个异步调用。

rawServiceCall : function(endpoint, type, payload) { 
        type = typeof type !== 'undefined' ? type : "get"; 
        payload = typeof type !== 'undefined' ? payload : null; 

        return $.ajax({ 
          url : endpoint, 
          type : type, 
          data : payload, 
          async : false, 
          dataType : 'json', 
          headers: { 
           accept : "application/json" 
          }, 
          success : function(data){ 
           return data; 
          } 
        }); 

       } 

P.S-我不想浪费CPU周期或保持网页的其他部分等待这首先加载。或者有什么更好的方法呢?

回答

0

简单的答案是否定的。行为将是完全同步或完全异步的。

但我不认为你有问题,因为你的代码是你寻求的解决方案的99%。你只需要知道如何评估.done()回调中返回的data

答案是.done()回调的参数与定义为ajax选项的success回调中的参数相同,即。 datatextStatusjqXHR

rawServiceCall: function(endpoint, type, payload) { 
    type = type || "get"; 
    payload = payload || null; 
    return $.ajax({ 
     url: endpoint, 
     type: type, 
     data: payload, 
     async: false, 
     dataType: 'json', 
     headers: { 
      accept: "application/json" 
     } 
    }); 
} 

serviceinterface.rawServiceCall(endpoint1).done(function(data, textStatus, jqXHR) { 
    //do something here 
}); 

$.when(serviceinterface.rawServiceCall(endpoint1), serviceinterface.rawServiceCall(endpoint2)).done(function(data, textStatus, jqXHR) { 
    // do something here 
}); 

同样是errorcomplete真正的回调,所以回调当量为jQuery.ajax承诺的完整列表是:

  • .done(function(data, textStatus, jqXHR){...})相当于success: function(data, textStatus, jqXHR){...}

  • .fail(function(jqXHR, textStatus, errorThrown){...})相当于error: function(jqXHR, textStatus, errorThrown){...}

  • .always(function((jqXHR, textStatus){...})相当于complete: function((jqXHR, textStatus){...}

每一个jQuery的承诺对象有.done().fail().always()方法,但这些方法回调所采取的参数(如果有的话),具体费用取决于什么传递时,原来的递延(从承诺所得到的)被解决/拒绝。

0

无法将异步方法转换为JavaScript中的同步没有浪费CPU周期。

停止执行代码的唯一方法是使用alert()。在JS中,你永远不会入睡,你只是闲着。