欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Angular服务Request异步请求的实例讲解

程序员文章站 2022-05-26 10:47:32
首先这里我简单写个例子来方便您的理解 var request = { post: function() { var errorcallback =...

首先这里我简单写个例子来方便您的理解

var request = {
  post: function() {
    var errorcallback = {
      error: function(f) {
        this.fun = f;
      },
      fun: function(data) {}
    };
    successcallback = {
      success: function(f) {
        return this.fun = f, console.log(this.fun), errorcallback;
      },
      fun: function(data) {
        console.log(data)
      }
    };
    returndata = {
      wsscat: "hello"
    };
    //成功
    //var a = successcallback.fun(returndata);
    a = successcallback.fun;
    settimeout('a(returndata)', 1000)
    return successcallback;
    }
    }
    request.post().success(function(data) {
      console.log("123");
      console.log(data);
    })
    console.log("wscat's test");

这里首先要理解一点很重要的就是异步回调,javascript的异步回调其实就两个常用方法,

settimeout定时这类和ajax请求这类

上面代码跟angular的request服务类似,首先是这个request对象,就相当于angular注入request服务之后返回的request对象

这个对象写了一个post方法,而post方法里面这有两个回调对象分别是

errorcallback和successcallback 

还有一个模拟ajax请求返回的returndata对象

returndata = {
      wsscat: "hello"
    };

这个在angular里面则是ajax请求服务器返回给你的json对象

我们看看这段代码执行之后会log出什么的信息,如下图

Angular服务Request异步请求的实例讲解

如果熟悉javascript的话这里不难理解,首先是输出的函数信息是因为success()函数里面的console.log(this.fun)这句

request.post().success() 

success()里面首先this.fun = f这句是,把匿名的回调函数赋给successcallback对象里面的fun方法,保存起来让后面settimeout进行回调

所以我们可以看到首先执行出来的是打印出来的回调函数,然后就是代码最后一句的

console.log("wscat's test"); 

明白了上述这个流程之后就可以很好的理解angular封装的request服务这一块

只不过angular里面的回调不是settimeout回调,而是换成了$http回调而已

$http.get(url).success(function(data, status, headers, config) {
//code
})

而$http请求又因为根据返回的成功或者失败把数据

用相应的方法带到我们放到了被匿名回调函数覆盖,对象successcallback的fun里面

而带数据到fun里面就是下面这两句

successcallback.fun(returndata); 
errorcallback.fun(returndata); 

后面我再深入说一下

$http.get(url).success(function(data, status, headers, config) {
//code
})

data:这个不用再多叙述了,我们上面做了这么多其实就是想拿服务器返回给我们的data

status:http响应状态码,这个是很基础的东西,但我还是简单说说

200:不用怀疑就是请求成功的意思

304:就是你请求已经被允许的情况下,服务器发现你需要的东西还是跟之前一样没变,则返回给你304

404:请求失败了,请求的资源再服务器没有发现

500:看到5一般就是服务器出错了

常看到的就这几个吧

header:头信息

config:生成原始请求的设置对象,如下图

Angular服务Request异步请求的实例讲解

再往下看,其实post请求和get请求区别是不大的

只是这里get更简单明了,你直接传url过来就行了,相比post请求接口还要带上各种需要请求的参数

但再仔细了解的话,其实post跟get在这里其实都走get请求

Angular服务Request异步请求的实例讲解

request服务源码

.service('request', [
  '$http',
  '$cookies',
  '$rootscope',
  '$window',
  '$cookiestore',
  '$location',
  function($http, $cookies, $rootscope, $window, $cookiestore, $location) {
    var request = {
      post: function(api, map, successcallback) {
        $rootscope.dataloadcount++;
        $rootscope.isloading = $rootscope.dataloadcount != 0;
        var url = '../test.php?api=' + encodeuricomponent(api);
        //console.log('[http requesturl]:' + api);
        //~ alert(api);
        var json = '{}';
        if (angular.isdefined(map)) {
          json = angular.tojson(map);
        }

        //console.log('[http requestjson]:' + json);
        url += '&data=' + encodeuricomponent(json);
        var errorcallback = {
          error: function(f) {
            this.fun = f;
          },
          fun: function(data) {}
        };
        var successcallback = {
          success: function(f) {
            return this.fun = f, errorcallback;
          },
          fun: function(data) {}
        };
        $http.get(url).success(function(data, status, headers, config) {
          console.log(config);
          // this callback will be called asynchronously
          // when the response is available
          $rootscope.dataloadcount--;
          $rootscope.isloading = $rootscope.dataloadcount != 0;

          //console.log('[http success responsedata]:' + angular.tojson(data));
          //~ alert('[http success responsedata]:'+angular.tojson(data));
          var returndata = {
            code: data.state.code,
            msg: data.state.msg,
            data: data.data
          };
          if (returndata.code == 1) {
            successcallback.fun(returndata);
          } else {
            if (returndata.code == 99) {
              alert(returndata.msg);
              $cookiestore.remove('token');
              $cookiestore.remove('userid');
              delete $cookies.token;
              delete $cookies.userid;
              $rootscope.islogined = false;
              $rootscope.$broadcast('refreshfooter');
              switch ($rootscope.isweixinlogin()) {
                case true:
                  $location.path('login');
                  break;
                case false:
                  $location.path('loginwebapp');
                  break;
              }

              return;
            }
            errorcallback.fun(returndata);
          }
        }).
        error(function(data, status, headers, config) {
          // called asynchronously if an error occurs
          // or server returns response with an error status.
          $rootscope.dataloadcount--;
          $rootscope.isloading = $rootscope.dataloadcount != 0;

          //console.log('[http error responsedata]:' + angular.tojson(data));
          //~ alert('[http error responsedata]:status:'+status);
          var returndata = {
            code: 0,
            msg: '网络请求失败',
            data: {}
          };
          errorcallback.fun(returndata);
        });

        return successcallback;
      },
      get: function(url, successcallback) {
        $rootscope.dataloadcount++;
        $rootscope.isloading = $rootscope.dataloadcount != 0;
        var errorcallback = {
          error: function(f) {
            this.fun = f;
          },
          fun: function(data) {}
        };
        var successcallback = {
          success: function(f) {
            return this.fun = f, errorcallback;
          },
          fun: function(data) {}
        };
        $http({
          method: 'get',
          url: url
        }).success(function(data, status, headers, config) {
          // this callback will be called asynchronously
          // when the response is available
          $rootscope.dataloadcount--;
          $rootscope.isloading = $rootscope.dataloadcount != 0;

          //console.log('[http success responsedata]:' + data);
          var returndata = {
            code: 1,
            msg: '请求成功',
            data: data
          };
          successcallback.fun(data);
        }).
        error(function(data, status, headers, config) {
          // called asynchronously if an error occurs
          // or server returns response with an error status.
          $rootscope.dataloadcount--;
          $rootscope.isloading = $rootscope.dataloadcount != 0;
          //console.log('[http error responsedata]:' + angular.tojson(data));
          var returndata = {
            code: 0,
            msg: '网络请求失败',
            data: ""
          };
          errorcallback.fun(returndata);
        });
        return successcallback;
      }
    }
    return request;
  }
])

以上这篇angular服务request异步请求的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。