2016-08-01 127 views
1

我試着把握自己的承諾,它看起來很簡單。我把它們想象成異步變量。我需要解決的問題之一是做出幾個AJAX調用,這些調用都需要成功解決,將它們依次鏈接在一起,也就是我需要使它們同步以獲得結果。由於使ajax調用sync: false已被棄用,我試圖使AJAX與promises同步。手動解析AJAX返回承諾

 $.when(
      ajaxCall(param1), 
      ajaxCall(param2) 
    ).then(
     function(data) { 
      console.log(['OK: ',data]); 
     }, function() { 
      console.log('Error'); 
     } 
    ).fail(function() { 
     console.log('Fail'); 
    }); 

和AJAX調用函數定義爲:

ajaxCall: function ($id) { 

     $.ajax({ 

      url: 'some_url' 
      type: 'POST', 
      dataType: "JSON", 
      data: packed, 

      success: function (data) { 

       var deferred = $.Deferred(); 
       switch (data.code) { 
        case 200: 
         deferred.resolve(data); 
         break; 
        default: 
         deferred.reject(data); 
         break; 
       } 

       return deferred.promise(); 

      }, 
      error: function() { 
       $.Deferred().reject(); 
      } 
     }); 

    } 

我直接做了一些假的AJAX調用,但從來沒有執行.fail分支,我不知道是什麼問題。 如果我將.then更改爲.done,則至少會執行錯誤回調,但不管我嘗試過什麼,我從未到達Fail分支。

解決方案可能很簡單,但看起來像我無法正確地制定問題找到解決我的問題。

所以我有樹的問題:

  1. 爲什麼.fail永遠不會被調用,而我需要做什麼改變,使其工作?
  2. 我基本明白了.done.then之間的區別。當承諾解決時都會調用這兩個函數,只有.then是可鏈接的,而不是(如果我是正確的)。 .done.fail通常配對成雙方都有一個回調,而.then有兩個。由於我在.done中使用了兩個回調函數,爲什麼第二個回調函數會被調用,因爲所有回調函數都是成功的回調函數?
  3. 爲什麼拒絕不叫失敗分支?

任何幫助表示讚賞。

回答

0

你可以做類似下面

var ajaxCall= function ($id) { 
    return $.ajax({ 

     url: 'some_url' 
     type: 'POST', 
     dataType: "JSON", 
     data: packed, 

     success: function (data) { 

      var deferred = $.Deferred(); 
      switch (data.code) { 
       case 200: 
        deferred.resolve(data); 
       break; 
       default: 
        deferred.reject(data); 
       break; 
      } 

      return deferred.promise(); 

     }, 
     error: function() { 
      $.Deferred().reject(); 
     } 
    }); 
}; 

var successCall= function(){ 
// code after both request completed with success; 

}; 

var failureCall= function(){ 
// code after both request completed and if have error 

}; 

$.when(ajaxCall(param1),ajaxCall(param2)) 
    .then(successCall, myFailure); 

我沒有測試過,但我看這種jQuery的文檔中的代碼在示例部分https://api.jquery.com/jquery.when/

說明結束執行功能myFunc的時候這兩個Ajax請求都是成功的,或者如果其中任何一個出現錯誤,我都會失敗。 ($ .ajax(「/page1.php」),$ .ajax(「/page2.php」)).then(myFunc,myFailure);}。

+0

你的代碼和我的代碼很相似,除了我的兩個回調函數在'.then'塊中。 – Izzy