为什么$ http.get不需要返回任何东西?

时间:2014-08-05 02:52:17

标签: javascript json angularjs angular-promise

我正在开发一个有角度的应用程序,我有一个调用服务的控制器。控制器将Url发送到服务。该服务向该Url发送GET请求并接收JSON。因为JSON是针对Http请求的Uri。我从JSON中提取该Uri,然后将浏览器重定向到它。

从端点返回的 JSON 看起来像这样

{  
   "profile":"...",
   "releases_url":"http://...",
   "name":"...",
   ...,
   "uri":"http://the-value-i-want-to-return.com",
   ...,
}

服务代码

// Resolves an API endpoint link to its Http counterpart
function resolveJSONEndpointToHttpUrl(JSONEndpointUrl) {
    return $http({ method: 'GET', url: JSONEndpointUrl }).
        success(function (data, status, headers, config) {
            console.log("resolveJSONEndpointToHttpUrl : data");
            console.log(data);

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

控制器代码

function redirectViaJSONLink(url) {
    return musicCollectionService.resolveJSONEndpointToHttpUrl(url).then(function (data) {
        console.log("redirectViaJSONLink : data");
        console.log(data);
        console.log("redirectViaJSONLink : data.data");
        console.log(data.data);
        console.log("redirectViaJSONLink : data.data.uri");
        console.log(data.data.uri);

        // Perform redirection
        // $window.location.href = data.uri;
    });
}

正如您所看到的,我正在进行一些日志记录以分解JSON并确切地知道返回给我的内容以及如何访问返回对象的属性。

我的问题是:

  1. 为什么我的return data;电话中不需要$http .success?在什么情况下我需要?
  2. 有没有办法在$http .success调用中从数据对象返回特定属性,这样我就不必在Controller方法中调用data.data.uri了?或者我可以在返回到我的Controller之前修改返回的JSON有效负载吗?

1 个答案:

答案 0 :(得分:0)

当使用来自promise的.success.error时,Angular对返回值不做任何操作,因此返回任何内容都没有意义。传递给.success/.error回调的值是原始承诺的结果。

但是,如果使用.then(success,error),则返回值将传递给promise链中的下一个promise。

例如,您可以修改服务以使用.then并返回uri:

<强>服务

// Resolves an API endpoint link to its Http counterpart
function resolveJSONEndpointToHttpUrl(JSONEndpointUrl) {
    return $http({ method: 'GET', url: JSONEndpointUrl }).
        then(function (data, status, headers, config) {
            console.log("resolveJSONEndpointToHttpUrl : data");
            console.log(data);

            return data.data.uri;
        });
}

<强>控制器

然后,在您的控制器中,您可以处理结果:

function redirectViaJSONLink(url) {
    return musicCollectionService.resolveJSONEndpointToHttpUrl(url).then(function (uri) {

        // Perform redirection
        $window.location.href = uri;
    });
}