angular中的$q()是用来处理异步的(主要是$http交互)
$q采用的是promise式的异步编程,异步编程最重要的核心就是回调,回调有三个关键部分:1:什么时候执行回调 2:执行什么回调 3:执行回调是传入什么参数
首先看$q()完整的api
$q的方法 :
一。$q,defer()返回一个对象,一般把它复制给defer变量
var defer=$q.defer()
*defer的 方法:
(一)defer.resolve(data)
对promise发起通知,通知执行成功的回调,回调执行的参数为data
(二)defer.reject(data)
对promise发起通知,通知执行失败的回调,回调执行的参数为data
(三)defer.notify(data)
对promise发起通知,通知执行进度的回调,回到执行的参数为data
*defer的属性
(一)defer.promise的属性
1.defer.promise.$$v
defer.promise.$$v对象就是对应的defer发送的data,当defer还没有发送通知时,$$v为空
*defer.promise的方法:
1.defer.promise.then([success],[error],[notify]);
.then方法接受三个参数,均为函数,函数在接受到defer发送通知时被执行,函数中的参数为defer发送通知时传入的data
[success]:成功回调。defer.resolve()时调用
[error]:失败回调,defer.reject()时调用
[notify]:进度回调,defer.notify()时调用
.then()方法返回一个promise对象,可以接续调用.then(),注意,无论.then()是调用的success函数,还是error函数,还是notify函数,发送给下一个promise对象的通知一定是成功通知,而参数则是函数的返回值.也就是说,then()方法里的函数被执行结束后,即为下一个promise发送了成功通知,并且把返回值作为参数传递给回调.
html:
js:
如果正确创建后台对于“/name”的请求处理,在一秒后返回“code_bunny”,则一秒后页面显示"成功code_bunny
成功code_bunny2"可以看到,第一个then()的成功的回调返回的data+2这个值被传到了下一个.then()的 成功回调的data参数中
如果后台没有创建对于"/name"的请求处理,则页面直接显示可以看到,就算第一个.then()调用的是失败回调,但是它发给下一个promise的通知依然是成功通知