小谈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时程序的执行过程,方便以后回顾。不足之处欢迎指正

posted @ 2016-04-12 00:42  Liujunyan_x  阅读(263)  评论(0编辑  收藏  举报