0

我正在开发一个角度应用程序,并且我有一个正在调用服务的控制器。控制器向服务发送一个 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这样我就不必调用data.data.uri我的 Controller 方法?或者我可以在返回的 JSON 有效负载返回到我的控制器之前对其进行修改吗?
4

1 回答 1

0

当使用.successor .errorfrom promise 时,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;
    });
}
于 2014-08-05T03:07:07.477 回答