AngularJS - Promise vs那么?

时间:2015-04-02 06:12:26

标签: angularjs promise

我有两个问题 -

1)"成功"有什么区别?然后"然后"? 示例 - $ http.get(url).then vs $ http.get(url).success?

2)承诺意味着将来会执行的事情,很好。我无法理解这与函数调用的区别。当我们使用" $ q.defer.resolve()"进行呼叫时执行promise呼叫。这不是函数调用吗?那么为什么这不是一个正常的函数,并执行任何其他函数调用,如foo()?我错过了一个特殊的承诺! ?

2 个答案:

答案 0 :(得分:4)

  

“成功”和“然后”有什么区别?

then()只接受一个参数:http响应对象。 success()有4个参数:响应数据,响应状态,响应标头和http配置对象。因此,当你关心的只是返回的数据时,success()更容易使用。正如New Dev所说,返回的值是不同的:then()返回从其回调返回的任何内容的新承诺,并允许您返回一个新值,从而构建一个promise链,而success()返回最初的承诺。

  

承诺意味着将来会执行的事情

不,不是真的。承诺是您现在执行的某些事情的结果,但结果不是立即可用的。由于JavaScript是单线程的,因此您不能只阻止并等待结果,因为这会完全冻结应用程序。因此,您只需注册一个回调函数,该函数将在结果可用时异步调用。例如:

$http.get('/some/url')

立即发送HTTP请求。但是为了获得结果,我们需要等待字节前往服务器,服务器处理请求并发回响应,以及响应前往浏览器。这可能需要几秒钟。那么$ http.get()立即返回的是一个承诺:即一个代表未来结果的对象(或者,一旦收到结果,就会产生一个未来的结果)。

答案 1 :(得分:1)

.then会返回新的承诺。

.success返回原始承诺。另一个区别是.successresponse.data作为输入参数,而.then获取response

这是how it's implemented

promise.success = function(fn) {
   promise.then(function(response) {
      fn(response.data, response.status, response.headers, config);
   });
   return promise;
};

您可以使用.success(和.error)来处理$http的相应结果,但无法修改数据或拒绝承诺(使用return $q.reject() }}给予$http承诺的最终消费者。

以下是一个人可以使用.success vs / .then的说明性示例:

return {
  getData: function(p1){
    return $http.get(url, {p1: p1})
             .success($log.log) // can use generic functions since there is 
             .error($log.error) // no requirement to return data
             .then(function(response){
                // here can massage the data into the output format
                return response.data; 
             });
};

我建议始终使用.then,因为它会返回一个没有.success.error处理程序的新承诺;这样可以避免API消费者使用$http特定.success / .error的可能性,从而无意中假设$http已被使用。