为什么我们更喜欢在angular中使用$q而不是$http ?
Why do we prefer using $q in angular instead of $http
我目前正在使用$q service从angular发出这样的API调用:
var deferred = $q.defer();
$http.get(config.apiHost + details.url)
.success(function (data) {
deferred.resolve(data);
}).error(function (msg) {
deferred.reject(msg);
});
return deferred.promise;
但是我们也可以不使用$q:
来使用这个方法return $http.get(config.apiHost + details.url)
.success(function (data) {
return data;
}).error(function (msg) {
return msg;
});
和$http本身返回承诺,我也可以使用更简单的方法:
$http.get(config.apiHost + 'posts')
.success(function (data) {
console.log(data)
}).error(function (msg) {
console.log(msg);
});
那么所有这些之间的区别是什么,特别是$q和$http之间,因为两者都返回promise并且都是异步的?angular是否通过$q提供了一些额外的功能?我找不到一个好的答案
$http
使用$q
,第一个例子是冗余的,第二个例子也是。您只需要返回$http.get
返回的承诺:
return $http.get(config.apiHost + details.url);
上面的代码与你的第一段代码相同。
此外,return msg
与deferred.reject(msg)
不相同。相当于throw msg
或return $q.reject(msg)
另一个需要注意的是,success
和error
是非标准的,您要使用then
和catch
$q
主要用于兼容默认情况下不支持承诺的库,以及当您无法依赖Promise
的本机实现时(例如在IE9等较旧的浏览器中)。(你)没有理由不这样用它。一个例子,如果你想做一个基于承诺的$timeout
。$http
本身使用$q
正是出于这些原因。
与其他(已删除)答案所建议的不同,您确实不需要使用$q
来"存储"$http
承诺的结果。我根本不建议存储承诺(因为这往往会导致意大利面条式代码),但如果你必须这样做,你可以只存储$http
的结果承诺;承诺只执行一次。
在promise被解析/拒绝后传递给then
的任何函数都将在下一个tick被解析,而不需要重新调用最初创建promise的原始操作-因此,promise的结果将在该对象中被记忆。
function legacyGet() {
const deferred = $q.defer()
$http.get('http://www.google.com')
.then((response) => deferred.resolve(Object.assign(response, {foo: bar}))
.catch((error) => deferred.reject(error))
return deferred.defer
}
function modernGet() {
return $http.get('http://www.google.com')
.then((response) => Object.assign(response, {foo: bar}))
}
总结:你的标题是错误的。我们不喜欢使用$q,我们只是偶尔使用它。最好使用ES6的Promise,除非你需要支持不支持它的浏览器和你不能使用polyfill
在angular中,几乎所有的服务都只返回承诺,但在某些情况下,你想使用$q
创建自己的延迟对象。
案例1
当你使用的库不支持promise,或者你创建了自己的函数,想要返回promise时,
案例2
当你使用任何默认返回承诺的结构,但你想在某些条件下返回一个单独的承诺时,
示例:在angular中,$http
只返回一个promise,但现在如果你想这样做,如果这个promise的响应包含一个特定的值,那么只有你想返回resolved否则返回failure,那么你需要创建自己的deffered object
,并需要根据$http
响应返回的值来解析或失败。
- Meteor如何接收HTTP请求
- 如何用更合适的内容替换document.write
- 有没有更好的动手、具体的方法来学习Javascript
- 在我的情况下,如何进行http请求
- 为什么像jQuery这样的javascript库通常更喜欢匿名函数而不是命名函数
- Angular http.get没有'我不喜欢在开头和结尾加方括号的文本文件
- 为什么Javascript程序员更喜欢在代码中重复字符串作为常量,而不是使用枚举类型的对象
- 何时更喜欢javascript中的匿名函数
- JavaScript相等运算符:有没有一个用例我更喜欢==而不是==
- 为什么大型网站不;I don’我更喜欢本地存储而不是cookie
- 从HTML模板中的$http请求中检索的$scope访问更深层次的数据
- 为什么 NodeJS 更喜欢逗号优先的编码风格
- 我什么时候应该更喜欢克隆而不是 javascript 中的引用
- AJAX 中 HTTP 对象的更简洁的语法
- 为什么更喜欢defaults()而不是Javascript原型
- Javascript开发:什么时候你更喜欢同步而不是异步
- 浏览器是否更喜欢精简的JS包?
- 使用画布会导致比使用图像更小的HTTP请求吗?
- 有没有办法获取哪个组是正则表达式中匹配的组.更喜欢Javascript,但Python也可以
- 为什么我们更喜欢在angular中使用$q而不是$http ?