2012-11-06 192 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中,你永遠不會入睡,你只是閒着。