我有两个问题 -
1)"成功"有什么区别?然后"然后"? 示例 - $ http.get(url).then vs $ http.get(url).success?
2)承诺意味着将来会执行的事情,很好。我无法理解这与函数调用的区别。当我们使用" $ q.defer.resolve()"进行呼叫时执行promise呼叫。这不是函数调用吗?那么为什么这不是一个正常的函数,并执行任何其他函数调用,如foo()?我错过了一个特殊的承诺! ?
答案 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
返回原始承诺。另一个区别是.success
将response.data
作为输入参数,而.then
获取response
。
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
已被使用。