2013-07-20 60 views
2

我有以下代碼,它們會爲jsonp數據提出單獨的請求。 在代碼「doRequestA」中正常工作並返回結果。我的問題是 我需要捕捉任何錯誤,如果它們發生。我試圖在 「doRequestB」中執行此操作,但只收到警報錯誤(我已經省略了doRequestB的回調)。在angularjs中使用jsonp請求進行異常處理

這裏是小提琴http://jsfiddle.net/a4Rc2/417/

function jsonp_callback(data) { 
    alert(data.found); 
} 

function jsonp_example($scope, $http) { 
    $scope.doRequestA = function() { 
     var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=jsonp_callback"; 
     $http.jsonp(url); 
    }; 

    $scope.doRequestB = function() { 
     var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts"; 
     $http.jsonp(url) 
      .success(function (data) { 
      alert(data.found); 
     }).error(function (data, status, headers, config) { 
      alert('error'); 
     }); 
    }; 
} 

任何意見是極大的讚賞,在此先感謝。

回答

3

您實際上在兩種情況下都錯誤地使用了$http.jsonp。你在第一種情況下看不到錯誤,因爲你沒有處理它。

使用Angular.js的$http.jsonp方法,回調方法會自動處理。您不應在結果字符串中使用自己的方法,而應將JSON_CALLBACK(完全按照書面)插入到字符串中。這樣,您可以使用從Angular返回的諾言處理響應。如果您觀看網絡活動(例如,使用Firebug或您選擇的瀏覽器中的開發人員工具),則會看到JSON_CALLBACK替換爲angular.callbacks._0*之類的內容。

在第二個例子中,你根本沒有定義回調方法,所以結果總是總是錯誤。實際上沒有辦法處理jsonp結果,因爲它只是返回沒有回調方法的JSON對象,而結果只是被忽略。

這裏的工作結果:http://jsfiddle.net/tPLaN/1/

代碼:

function jsonp_callback(data) { 

    alert(data.found); 
} 


function jsonp_example($scope, $http) { 
    $scope.doRequestA = function() { 

     var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=JSON_CALLBACK"; 

     $http.jsonp(url).success(function(data) { 
      jsonp_callback(data); 
     }); 
    }; 


    $scope.doRequestB = function() { 

     var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=JSON_CALLBACK"; 


     $http.jsonp(url)    
     .success(function (data) { 

      alert(data.found); 

     }).error(function (data, status, headers, config) { 

      alert('error');   
     }); 
    };  
} 

我唯一改變的是

  1. 糾正兩個URL。
  2. 在承諾上的.success()方法內的第一個方法上移動回調處理程序。

不管你相信與否,需要JSON_CALLBACKthe documentation for $http.jsonp,但它的那種隱藏的。


*注意,請不要使用替代JSON_CALLBACK什麼。這是Angular生成的私有方法,我只是將它展示出來,以幫助更好地理解發生的事情。