2015-11-27 51 views
0

我在我服务的一个这种方法来进行API调用承诺:

this.postData = function(requestURL, requestObj) { 
var deferred = $q.defer(); 
console.log("Reached APIService @POST", requestURL); 
$http.post(requestURL, requestObj).success(
    function(data, status, headers, config, statusText) { 
     deferred.resolve(data, status, headers, config, statusText); 
     console.log(status); 
    }).error(
    function(data, status, headers, config, statusText) { 
     deferred.reject(data, status, headers, config, statusText); 
     console.log(status); 
    }); 
return deferred.promise; 
}; 
}); 

基本上,这工作得很好,但最近我需要在我的代码头的数据,以获取出现异常时的错误消息。我很困惑如何获得返回的承诺中的信息。上述函数调用时只返回数据,其余4项未定义。我相信承诺不能解决上述多项问题。

那怎么办我返回的对象中的承诺,以获得对象由API返回的整个信息。 (正如文档所说,响应包含5个字段,数据,状态,标题,配置,statusText)。

需要帮助的..

+0

解决或拒绝承诺之前,你试图注销其他参数(数据,状态,头,配置,状态文本)?他们注销了吗? – charliebrownie

+0

我正在注销数据和状态,是的他们打印出这种服务方法很好。 –

+0

查看@Thomas解决方案,这是最好的方法:'$ http.post'已经返回一个promise,所以你应该避免'$ q.defer()' - 也被称为[** deferred antipattern **](http://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it) – charliebrownie

回答

1

承诺只能解析到一个值,不是五个,所以你传递给resolve其余参数都丢弃。

的好消息是,$http.post()本身就已经返回一个承诺,所以你可以这样做:

this.postData = function (requestURL, requestObj) { 
      console.log("Reached APIService @POST", requestURL); 
      return $http.post(requestURL, requestObj).then(
       function (response) { 
        console.log(status); 
        return response; 
       }), 
       function (response) { 
        console.log(status); 
        return response; 
       }); 
     }; 
    }); 

或者不记录:

this.postData = function (requestURL, requestObj) { 
      return $http.post(requestURL, requestObj); 
    }); 

response对象有场datastatusheaders等等。 Documentation.

+0

我错过了'$ http。 post'已经返回了一个'promise'。你是对的,你的解决方案是最好的,避免“延迟反模式”。 – charliebrownie