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

Why does $http.get not need to return anything?

本文关键字:返回 任何东 不需要 Get http 为什么      更新时间:2023-09-26

我正在制作一个angular应用程序,我有一个正在调用服务的控制器。控制器向服务发送一个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. 为什么我的$http .success呼叫不需要return data; ?在什么情况下我需要这样做?
  2. 是否有一种方法可以从$http .success调用中的数据对象返回特定属性,以便我不必在控制器方法中调用data.data.uri ?或者我可以在返回到控制器之前修改返回的JSON有效负载吗?

当从promise中使用.success.error时,Angular对返回值不做任何处理,所以返回任何值都没有意义。传递给.success/.error回调函数的值是原始承诺的结果。

如果您使用.then(success,error),那么返回值将传递给承诺链中的下一个承诺。

例如,您可以修改您的服务以使用.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;
    });
}