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


Posted in Javascript onAugust 13, 2018

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

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异步请求的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
Dec 08 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
Jan 19 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
Feb 08 Javascript
浅谈Webpack打包优化技巧
Jun 12 Javascript
jQuery实现的点击按钮改变样式功能示例
Jul 21 jQuery
微信小程序数据分析之自定义分析的实现
Aug 17 Javascript
微信小程序自定义导航教程(兼容各种手机)
Dec 12 Javascript
如何从零开始手写Koa2框架
Mar 22 Javascript
浅谈JS中this在各个场景下的指向
Aug 14 Javascript
vue-cli 为项目设置别名的方法
Oct 15 Javascript
Antd表格滚动 宽度自适应 不换行的实例
Oct 27 Javascript
JavaScript快速调试的两个技巧
Nov 04 Javascript
微信小程序中使用wxss加载图片并实现动画效果
Aug 13 #Javascript
深入浅析angular和vue还有jquery的区别
Aug 13 #jQuery
Angular异步变同步处理方法
Aug 13 #Javascript
利用JS实现一个同Excel表现的智能填充算法
Aug 13 #Javascript
Vue自定义弹窗指令的实现代码
Aug 13 #Javascript
深入Vue-Router路由嵌套理解
Aug 13 #Javascript
AngularJS与后端php的数据交互方法
Aug 13 #Javascript
You might like
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
在PHP中利用wsdl创建标准webservice的实现代码
2011/12/07 PHP
PHP使用JSON和将json还原成数组
2015/02/12 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
可缩放Reloaded-一个针对可缩放元素的复用组件
2007/03/10 Javascript
JavaScript 密码强度判断代码
2009/09/05 Javascript
js 获取、清空input type="file"的值(示例代码)
2013/12/24 Javascript
js判断数据类型如判断是否为数组是否为字符串等等
2014/01/15 Javascript
js实现的光标位置工具函数示例
2016/10/03 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
详解JavaScript常量定义
2017/01/03 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
2017/06/25 Javascript
Vue axios 中提交表单数据(含上传文件)
2017/07/06 Javascript
Javascript实现购物车功能的详细代码
2018/05/08 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
[43:57]Liquid vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python Sleep休眠函数使用简单实例
2015/02/02 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
Flask框架web开发之零基础入门
2018/12/10 Python
Python基础之条件控制操作示例【if语句】
2019/03/23 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
聘任书的写作格式及范文
2014/03/29 职场文书
乡镇党员群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python
python爬虫请求库httpx和parsel解析库的使用测评
2021/05/10 Python
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python