angularjs - 谁能解释一下 angularjs 中 $q 服务的使用?

标签 angularjs

这个问题在这里已经有了答案:





AngularJS Promises, $q, defer

(2 个回答)


4年前关闭。




我是新来的 angularjs .我看到了$q在restful api调用中检查promise。$q.defer()用于保留 promise 对象。
我读到了 promise ,但我什么也没得到。
虽然我可以在没有 $q 的情况下进行 api 调用,但是它在文章的某处使用。

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

请帮忙。
谢谢

最佳答案

我想我写的关于 $q 的文章可能对你有帮助。

$q 简介

$q 是一个 Angular 定义的服务。它与 new Promise() 相同。但是 $q 通过增强开发人员可以用来更简单地执行复杂任务的附加功能,将事情提升到一个新的水平。

这是使用 $q 创建 promise 的示例

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 构造函数的实例。创建 defer 对象后,您可以从该对象访问以下方法和属性
resolve(value) – 用值解析派生的 promise 。如果值是通过 $q.reject 构造的拒绝,则 promise 将被拒绝。
reject(reason) – 拒绝带有原因的派生 promise 。这等效于使用通过 $q.reject 构造的拒绝来解决它。
notify(value) - 提供 promise 执行状态的更新。在 promise 被解决或拒绝之前,这可能会被多次调用。
promise – {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 从非 promise 对象/回调构造 promise ,并利用 $q.all() 和 $q.race() 来处理现有的 promise 。

关于angularjs - 谁能解释一下 angularjs 中 $q 服务的使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43495864/

相关文章:

javascript - AngularJS 从模块加载作用域函数

javascript - 在 Angular JS 中处理模式最简单的方法是什么?

javascript - 如果我们从 html 页面调用 Angular 函数那么它将如何工作?

javascript - ngView 中的模板调用不支持 Angular Directive(指令) stackoverflow

javascript - $window .on ("scroll") 仅在调用它的最后一个指令中工作

angularjs - 如何缓存angularjs部分?

javascript - 使用 Angular 保存 Corovas 暂停上的应用程序状态

javascript - AngularJS/Rails $http.post 数据字段名称作为变量

javascript - 制作 ng-donut 可点击的 AngularJs

angularjs - 当所有输入都是空白时,Angular 表单是 $valid,为什么?