小谈angualr $q
以一个$()请求为例代码如下
$http({ method:'GET', url:'../temp.json' }).then(function(data) { // data为返回的数据对象 console.log('请求成功'); }, function(err) { // err为请求失败后返回的错误信息 console.log('请求失败'); } );
以上代码使用angualr内置的$http函数发起一个get请求,then方法可以传入两个回掉函数,这个没什么谈的,当然还可以有下面的链式调用
$http({ method:'GET', url:'../temp.json' }).then(function(data) { // data为返回的数据对象 console.log('请求成功'); }, function(err) { // err为请求失败后返回的错误信息 console.log('请求失败'); } ).then(function(data) { // data为返回的数据对象 console.log('请求成功'); }, function(err) { // err为请求失败后返回的错误信息 console.log('请求失败'); } );
需要注意的是当请求失败后会在第一个then的失败回掉函数中执行代码,之后程序可以顺利地执行下面的then的成功的回掉函数,如果第一个then未提供失败的回掉函数,则程序会调用第二个then的失败的回掉函数。
结合$q往往有下面的代码使用
$http({ method:'GET', url:'../temp.json' }).then(function(data) { var defer = $q.defer(); console.log('chneggongle'); var a = true; if(!a){ defer.reject({ type: -1, data: data });}else { defer.resolve(data.data); } return defer.promise; }, function(err) { // err为请求失败后返回的错误信息 console.log('请求失败'); } ).then(function(data) { // data为返回的数据对象 console.log('请求成功'); }, function(err) { // err为请求失败后返回的错误信息 console.log('请求失败'); } );
上述代码可以简单理解为当请求成功是我们执行第一个then的成功的回调,里面使用了$q.defer(),试想,如果我们有这样的一个需求,即虽然请求成功发送了,数据也返回了,但是返回的数据并不符合我们的需求,于是我想此时程序可以调用失败的回调,于是可以使用$q.defer()返回的对象,当我们判断出返回的数据不符合要求时使用$q.defer.reject(),这是什么意思呢,注意我们在第一个then成功的回调的最后返回了一个$q.defer.promise,意味着如果我们的请求时成功的,那将由这个返回的$q.defer.promise对象去调用第二个then,那具体调用第二个then的成功的回调函数还是失败的呢,这里就可以简单地认为$q.defer.reject()调用了第二个then的失败的回调,再看第一个then成功的回调函数里还有一句是$q.defer.resolve(),这句可以理解为调用第二个then的成功的回调函数。
这样通过第一个then中的$q,我们就可以根据js逻辑的判断,去灵活地执行下一个then中成功与失败的回调了,当然上述过程的描述可能有概念上的错误,此博客重点仅用以记录$q配合$http时程序的执行过程,方便以后回顾。不足之处欢迎指正