2

I have the following code which make seperate requests for jsonp data. In the code "doRequestA" works fine and returns a result. The issue I have is I need to catch any errors if they occur. I have tried implementing this in "doRequestB", but only receive the alert error (I have ommitted the callback from doRequestB).

Here is the fiddle 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');
        });
    };
}

Any advice is greatly appreciated, thanks in advance.

4

1 回答 1

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()在 promise的方法内移动第一个方法的回调处理程序。

信不信由你,需要JSON_CALLBACK 文档中$http.jsonp,但它有点隐藏。


*请注意,请不要将替代品JSON_CALLBACK用于任何东西。这是 Angular 生成的私有方法,我只是展示它以帮助更了解正在发生的事情。

于 2013-07-21T01:28:30.457 回答