2016-06-07 129 views
0

乍一看,你似乎可以將jqXHR對象從jquery轉換爲ES6 Promise。但是,如果請求失敗,錯誤處理程序將進入無限循環,因爲傳遞給catch/error回調的參數是jqXHR本身,所以Promise被拒絕,並拒絕一個拒絕給它自身的可執行文件,導致無限循環。Promise.resolve on jqXHR ajax導致無限循環

將jqXHR轉換爲Promise而不會導致錯誤循環的最佳方法是什麼?

我想到的兩種可能的解決方案是以某種方式獲得原始的XMLHttpRequest並在失敗時拒絕承諾,或者將jqXHR包裝在另一個對象中,而不使用then方法。

雖然這兩個看起來都很尷尬?有沒有一種方法可以讓Promise跟隨其解析/拒絕的價值後續功能?還是不太理想,一種從jqXHR獲取原始XMLHttpRequest的方法?

回答

0

如何使用諾言包裝$.ajax呼叫?

喜歡的東西:

var request = new Promise(function(resolve, reject) { 
    $.ajax({ 
     url: '...', 
     data: { ... }, 
     method: 'POST', 
     success: function(response) { 
      resolve(response); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      reject(errorThrown); 
     } 
    }); 
}); 

request.then(...).catch(...); 
+0

這仍然得到一個無限循環,因爲響應參數是本身傳遞到錯誤回調的jqXHR。拒絕試圖追隨可敬的人。 – Thayne

+0

你是對的!請看我編輯的答案。現在'error'函數得到三個參數而不是一個。 –