2012-06-01 37 views
12

我有一個$.ajax承諾,並且希望檢查我的(語法有效的)響應是否包含錯誤,從而在此情況下觸發拒絕狀態。在jQuery的延期對象中拋出一個錯誤

我已經與我自己的諾言庫一起工作,它很容易處理這些任務。我不太喜歡jQuery的Promisecache)實現它的Deferred object,可能忽略了一些東西,因爲我很少使用它。我覺得去只是使用.then(),這看起來是那樣的較爲複雜:

return $.ajax(...).then(function success(response) { 
    var problem = hasError(response); 
    if (problem) { 
     var error = new $.Deferred; 
     error.reject(problem); 
     return error; 
    } else 
     return response; 
}); 

這應返回它在網絡錯誤或問題的響應的情況下,拒絕承諾。但是返回被拒絕的延期真的是最好的方法嗎?

我也會在如何處理這些「錯誤拋出響應處理程序」的ajax選項本身幫助appriciate,我找不到有關他們的好文檔。


聲明:不,我不能改變服務器響應。問題檢測方法是同步的。我不想使用其他庫,我對jQuery解決這個問題的方式特別感興趣。

+0

OK,用'。然後()'我的意思是'.pipe()'做的事jquery :-( – Bergi

+0

截至Jquery 1.8管===然後 – Plynx

+0

是的,幸運的是,他們得到了至少修正。 – Bergi

回答

31

現在更新的jQuery的1.8+

來解決這個最簡單的方法是通過.then過濾器的基礎上的數據的成功或失敗運行的$.ajax響應。

$.ajax() 
    .then(function (response) { 
     return $.Deferred(function (deferred) { 
      var problem = hasError(response); 

      if (problem) { 
       return deferred.reject(problem) 
      } 

      deferred.resolve(response); 
     }).promise(); 
    }); 

你可以再回到這個新的承諾,任何調用代碼將消耗這一點:

var request = function() { 
    return $.ajax() 
     .then(function (response) { 
      return $.Deferred(function (deferred) { 
       var problem = hasError(response); 

       if (problem) { 
        return deferred.reject(problem) 
       } 

       deferred.resolve(response); 
      }).promise(); 
     }); 
}; 

request() 
    .done(function (response) { 
     // handle success 
    }) 
    .fail(function (problem) { 
     // handle failure 
    }); 
+0

管道和管道之間有什麼區別? – Bergi

+1

'pipe'允許您在發送給任何已註冊的承諾處理程序之前過濾遞延的值。當一個承諾解決或拒絕時,'then'實際上只用於註冊處理程序。 – Eli

+1

不,[按規格](http://webcache.googleusercontent.com/search?q=cache%3awiki.commonjs.org/wiki/Promises/A).then()會做到這一點。或者jQuery扔這個和交換方法名稱? – Bergi