在Angular中使用promise

在Angular应用中,推荐将网络请求操作放在Service中以分离职责。本文以创建addressBook.service.js为例,介绍如何利用$http服务获取Promise对象,并通过then、catch、finally方法处理响应。在Controller中调用Service,实现数据与视图的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在ng中最好将网络请求放在service中,从而简化controller,使controller专注做自己的“桥梁”工作,即连接数据与视图。比如我们在做一个通讯录,所以我们可以这样做:
1.建一个service叫addressBook.service.js

(function () {
    'use strict';
  angular
    .module('gulpAngularProject')
    .service('addressBookService', addressBookService);
   function addressBookService ( $http,$q ) {
       /**
        * 用于多个接口同时请求
        * @param taskArray (array) [promise任务的数组]
        */
       this.promiseAll = function(taskArray) {
           return $q.all(taskArray);
       },
       /**
        * 获得通讯录列表
        */
        this.getUserInfoContactList = function () {
            var defered = $q.defer();
            $http({
                method: 'GET',
                url: 'getUserInfoContactList'
            })
                .success(function (data) {
                    defered.resolve(data);
                })
                .error(function (err) {
                    defered.reject(err);
                });
            return defered.promise;
        }
   }
})();

在这里我们需要用 http q服务, http q这个Service提供的Promise对象,事实上Promise对象有三个通用方法:then, catch, finally。 上述的success和error是$http提供的两个额外的方法。

2.然后在controller中就可以这样用:

(function () {
    'use strict';
  angular
    .module('gulpAngularProject')
    .controller('addressBookController', addressBookController);
   function addressBookController ( addressBookService ) {
       // 处理一个请求成功回调后再处理另一个请求的情况
       addressBookService.getUserInfoContactList()
           .then(function (resolveData) {
               // 成功返回的数据
               console.log(resolveData);
               // 返回这个请求成功后要处理的另一个请求,所以下面又可以then下去
               return addressBookService.getUserInfoContactList()
           })
           .then(function (resolveData) {
               console.log(resolveData);
           })
           .catch(function (rejectData) {
               // 错误的统一捕捉
               console.log(rejectData);
           });

       // 处理多个请求同时发起的情况
       var task1 = addressBookService.getUserInfoContactList();
       var task2 = addressBookService.getUserInfoContactList();
       var task3 = addressBookService.getUserInfoContactList();
       // 使用在addressBookService里封装的方法,其实就是$q.all(taskArray)
       addressBookService.promiseAll([task1,task2,task3])
           .then(function (resolveArray) {
               // 返回的是task123成功后的数据数组
               console.log(resolveArray);
           })
           .catch(function (rejectData) {
               console.log(rejectData);
           });
   }
})();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值