谁能解释在angularjs中使用$ q服务?

时间:2017-04-19 12:31:43

标签: angularjs

我是angularjs的新手。我看到$q在宁静的api电话中检查承诺。 $q.defer()用于保留promise对象。 我读到了承诺,但我没有得到任何东西。 虽然我可以在没有$q的情况下进行api调用,但它会在文章的某个地方使用。

所以我想知道$q的确切用法以及在没有$q的情况下进行api调用的区别。

请帮助。 谢谢

2 个答案:

答案 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)

我喜欢这个问题。因为,我也面对这个。

这是一项服务,可以帮助您异步运行函数,并在处理完毕后使用它们的返回值。

Brief Description

Refer example

Promise with $q

示例:

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;
            });
    };
});