我怎样才能在angularjs promise中解析这个结果

时间:2015-05-23 07:53:11

标签: javascript angularjs

我有这样的服务

app.service('newsService', function($q, $timeout,$http) {

  this.getNewsName = function(id) {
    var deferred = $q.defer();
    var newsId = parseInt(id, 10);

    $timeout(function() {

         $http({
                url: "entry/GetNewsTitle",
                 method: "POST",
                 data: $.param({'id':newsId}),
                 headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
                    })
                    .success(function(data, status, headers, config) {

                        deferred.resolve(data.name);
                    })
                    .error(function(data, status, headers, config) {
                        console.log('failed');
                    });
                }, 10);

    return deferred.promise;
  } 

另一个函数中的console.log(deferred.promise)给了我三个函数" catch" "最后"然后"然后"但我怎样才能再次达到data.name

2 个答案:

答案 0 :(得分:4)

像这样:

newsService.getNewsName(id).then(function(name) {

});

答案 1 :(得分:2)

首先,您应该优化服务方法以避免Deferred anti-pattern。您不需要创建虚拟延迟对象,因为$http(...)已经返回Promise。

服务看起来像这样:

app.service('newsService', function($http) {

    this.getNewsName = function(id) {
        return $http({
            url: "entry/GetNewsTitle",
            method: "POST",
            data: $.param({
                'id': parseInt(id, 10)
            }),
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            }
        }).success(function(data, status, headers, config) {
            return data.name;
        }).error(function(data, status, headers, config) {
            console.log('failed');
        });
    };

});

注意,getNewsName会返回$http的结果。

使用此服务的控制器将使用Promise API链接到它:

newsService.getNewsName(123).then(function(name) {
    console.log(name);
});