我是angularjs
的新手。我看到$q
在宁静的api电话中检查承诺。
$q.defer()
用于保留promise对象。
我读到了承诺,但我没有得到任何东西。
虽然我可以在没有$q
的情况下进行api调用,但它会在文章的某个地方使用。
所以我想知道$q
的确切用法以及在没有$q
的情况下进行api调用的区别。
请帮助。 谢谢
答案 0 :(得分:22)
我认为我写的关于$ q的文章可能对你有帮助。
$ q简介
$ q是一个角度定义服务。它与新的Promise()相同。但是,$ q通过增强开发人员可以用来更简单地执行复杂任务的附加功能,将事情提升到了一个新的水平。
这是使用$ q
创建承诺的示例angular.module("app",[])
.controller("ctrl",function($scope,$q){
var work = "resolve";
var promise = $q(function(resolve, reject) {
if (work === "resolve") {
resolve('response 1!');
} else {
reject('Oops... something went wrong');
}
});
promise.then(function(data) {
alert(data)
})
})
<强> $ q.defer()强>
$ q.defer()返回promise构造函数的实例。创建延迟对象后,您可以从该对象访问以下方法和属性
resolve(value)
- 使用值解析派生的promise。如果该值是通过$ q.reject构造的拒绝,则承诺将被拒绝。
reject(reason)
- 拒绝派生的承诺。这相当于通过$ q.reject构建的拒绝来解决它。
notify(value)
- 提供有关承诺执行状态的更新。在承诺解决或拒绝之前,可以多次调用此方法。
promise
- {Promise} - 与此延迟
参见示例
angular.module("app",[])
.controller("ctrl",function($scope,$q){
var work = "resolve";
function getData(){
var obj = $q.defer();
if (work === "resolve") {
obj.resolve('response 1!');
} else {
obj.reject('Oops... something went wrong');
}
return obj.promise;
}
getData().then(function(data) {
alert(data)
})
})
<强> $ q.all()强>
如果用户需要一次发送多个请求,那么用户可以使用$ q.all()服务。
$q.all([$http.get('data1.json'),$http.get('data2.json')])
.then(function(response){
console.log(response[0].data) // data1.json response
console.log(response[1].data) // data1.json response
})
在这里,有两个http请求同时发送到两个单独的json文件以获取数据。响应来自数组和响应顺序与http请求顺序相同。
<强> $ q.race()强>
$ q.race()与$ q.all()非常相似。但是,它不会发送每个请求的响应,而只会返回一个请求响应。具体来说,只返回已执行的第一个请求的响应。这并不意味着它不会发送其他请求。所有请求都在发送,但它只返回第一个执行请求的响应。
$q.race([$http.get('data1.json'),$http.get('data2.json')])
.then(function(response){
console.log(response[0].data) // return one response
})
在这里,响应可以是data1.Json或data2.json。这是使用这种方法的垮台。由于它返回第一个执行请求的响应,无法确定哪个请求响应将由promise解决。此方法对于您不希望看到所有请求的响应的批量请求非常有用
<强>结论强>
使用$ q构建来自非承诺对象/回调的承诺,并使用$ q.all()和$ q.race()来处理现有的承诺。
答案 1 :(得分:3)
我喜欢这个问题。因为,我也面对这个。
这是一项服务,可以帮助您异步运行函数,并在处理完毕后使用它们的返回值。
示例:
app.service("githubService", function($http, $q) {
var deferred = $q.defer();
this.getAccount = function() {
return $http.get('https://api.github.com/users/haroldrv')
.then(function(response) {
// promise is fulfilled
deferred.resolve(response.data);
// promise is returned
return deferred.promise;
}, function(response) {
// the following line rejects the promise
deferred.reject(response);
// promise is returned
return deferred.promise;
});
};
});