我是新手angularjs。我$q在宁静的api调用中看到了检查诺言的信息。 $q.defer()被用来保留promise对象。我读了诺言,但一无所获。尽管我可以不带api进行api调用$q,但是在文章中的某处使用了它。
angularjs
$q
$q.defer()
所以我想知道在$q没有的情况下进行api调用的确切用法和区别$q。
请帮助。谢谢
我认为我写的有关$ 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)–用价值解决派生的诺言。如果该值是通过$ q.reject构建的拒绝,则将拒绝该promise。
resolve(value)
reject(reason)–拒绝产生的承诺并提供理由。这等效于通过$ q.reject构造的拒绝来解决它。
reject(reason)
notify(value)-提供有关承诺执行状态的更新。在兑现承诺之前,可能会多次调用此命令。
notify(value)
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从非承诺对象/回调构造承诺,并利用$ q.all()和$ q.race()处理现有的承诺。