Angularjs Promise实例详解

promise是一个构造函数,自己身上有all、reject、resolve这几个异步方式处理值的方法,原型上有then、catch等同样很眼熟的方法,下面通过实例代码给大家讲解angularjs promise 的相关知识,感兴趣的朋友一起看看吧

一、什么是Promise

Promise是对象,代表了一个函数最终可能的返回值或抛出的异常,就是用来异步处理值的。

Promise是一个构造函数,自己身上有all、reject、resolve这几个异步方式处理值的方法,原型上有then、catch等同样很眼熟的方法。

二、为什么使用Promise

有了Promise对象,就可以把异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供了统一的接口,使得控制异步操作更加容易。

Promise对象有以下2个特点:

1.对象的状态不受外界影响。

Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

2.一旦状态改变,就不会再变,任何时候都可以得到这个结果。

Promise对象的状态改变,只有两种可能:从Pending变为Resolved;从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。

三、如何创建一个Promise

先贴一段代码:

define([  'angularModule'],function (app) {  app.register.service('httpRequestService', ['$http', '$q', function ($http, $q) {    return{      request: function (params) {        var deferred = $q.defer();        $http({          method : params.method,          url : params.url        }).success(          function (data) {            deferred.resolve(data);          }        ).error(          function(data){            deferred.reject(data);          }        );        return deferred.promise;      }    }  }])});

登录后复制

 讲一下$q服务

q服务是AngularJS中自己封装实现的一种Promise实现。

要创建一个deferred对象,可以调用defer()方法:

var deferred = $q.defer(); //deffered上面暴露了三个方法,以及一个可以用于处理promise的promise属性。 //promise属性里面又包含了then、catch、finally三个方法

登录后复制

Angularjs Promise实例详解

在Promise中,定义了三种状态:等待状态,完成状态,拒绝状态。

deffered API

1.deffered 对象的方法

1.resolve(value):在声明resolve()处,表明promise对象由pending状态转变为resolve。
2.reject(reason):在声明resolve()处,表明promise对象由pending状态转变为rejected。
3.notify(value) :在声明notify()处,表明promise对象unfulfilled状态,在resolve或reject之前可以被多次调用。

2.deffered 对象属性

promise :最后返回的是一个新的deferred对象 promise 属性,而不是原来的deferred对象。这个新的Promise对象只能观察原来Promise对象的状态,而无法修改deferred对象的内在状态可以防止任务状态被外部修改。

3.Promise API

当创建 deferred 实例时会创建一个新的 promise 对象,并可以通过 deferred.promise 得到该引用。

promise 对象的目的是在 deferred 任务完成时,允许感兴趣的部分取得其执行结果。

4.promise 对象的方法

1.then(errorHandler, fulfilledHandler, progressHandler):then方法用来监听一个Promise的不同状态。errorHandler监听failed状态,fulfilledHandler监听fulfilled状态,progressHandler监听unfulfilled(未完成)状态。此外,notify 回调可能被调用 0到多次,提供一个进度指示在解决或拒绝(resolve和rejected)之前。

2.catch(errorCallback) —— promise.then(null, errorCallback) 的快捷方式

3.finally(callback) ——让你可以观察到一个 promise 是被执行还是被拒绝, 但这样做不用修改最后的 value值。 这可以用来做一些释放资源或者清理无用对象的工作,不管promise 被拒绝还是解决。

q常用的几个方法:

defer() 创建一个deferred对象,这个对象可以执行几个常用的方法,比如resolve,reject,notify等

all() 传入Promise的数组,批量执行,返回一个promise对象

when() 传入一个不确定的参数,如果符合Promise标准,就返回一个promise对象。

all()方法

当批量的执行某些方法时,就可以使用这个方法。有了all,你就可以并行执行多个异步操作,并且在一个回调中处理所有的返回数据。

用Promise.all来执行,all接收一个数组参数,里面的值最终都算返回Promise对象。这样,三个异步操作的并行执行的,等到它们都执行完后才会进到then里面。

那么,三个异步操作返回的数据哪里去了呢?都在then里面呢,all会把所有异步操作的结果放进一个数组中传给then,就是 下面的results。所以下面代码的输出结果就是:     

  var funcA = function(){        console.log("funcA");        return "hello,funA";      }      var funcB = function(){        console.log("funcB");        return "hello,funB";      }      $q.all([funcA(),funcB()])      .then(function(result){        console.log(result);      });

登录后复制

执行的结果:

funcAfuncBArray [ "hello,funA", "hello,funB" ]

登录后复制

when()方法

when方法中可以传入一个参数,这个参数可能是一个值,可能是一个符合promise标准的外部对象。

      var funcA = function(){        console.log("funcA");        return "hello,funA";      }      $q.when(funcA())      .then(function(result){        console.log(result);      });

登录后复制

当传入的参数不确定时,可以使用这个方法。

hello,funA

四、链式请求

通过then()方法可以实现promise链式调用,因为then方法总是返回一个新的promise。

runAsync1().then(function(data){  console.log(data);  return runAsync2();}).then(function(data){  console.log(data);  return runAsync3();}).then(function(data){  console.log(data);});function runAsync1(){  var p = new Promise(function(resolve, reject){    //做一些异步操作    setTimeout(function(){      console.log('异步任务1执行完成');      resolve('随便什么数据1');    }, 1000);  });  return p;      }function runAsync2(){  var p = new Promise(function(resolve, reject){    //做一些异步操作    setTimeout(function(){      console.log('异步任务2执行完成');      resolve('随便什么数据2');    }, 2000);  });  return p;      }function runAsync3(){  var p = new Promise(function(resolve, reject){    //做一些异步操作    setTimeout(function(){      console.log('异步任务3执行完成');      resolve('随便什么数据3');    }, 2000);  });  return p;      }

登录后复制

运行结果:

Angularjs Promise实例详解

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

NodeJS父进程与子进程资源共享原理与实现方法

vue中实现图片和文件上传的示例代码

Vue实现搜索 和新闻列表功能简单范例

以上就是Angularjs Promise实例详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2753967.html

(0)
上一篇 2025年3月8日 06:48:54
下一篇 2025年3月8日 06:49:02

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS实现导出Excel的五种方法详解

    这篇文章主要介绍了js实现导出excel的五种方法,结合实例形式较为详细的分析了基于table表格导出excel文件的相关操作技巧,并附源码供读者下载参考,需要的朋友可以参考下 本文实例讲述了JS实现导出Excel的五种方法。分享给大家供大…

    编程技术 2025年3月8日
    000
  • 怎样使用Nodejs内存治理

    这次给大家带来怎样使用Nodejs内存治理,使用Nodejs内存治理的注意事项有哪些,下面就是实战案例,一起来看一下。 运行的宿主环境不同,相应的对内存治理的要求也不一样,当宿主环境是浏览器时,由于网页的运行时间短,且只运行在用户的机器上(…

    编程技术 2025年3月8日
    200
  • p5.js入门教程和基本形状绘制

    本篇文章主要介绍了p5.js入门教程之简介和基本形状绘制,现在分享给大家,也给大家做个参考。 一、什么是p5.js 最近接触了一门数字媒体艺术类的课程,名为Interactivity,教的是p5.js。 主讲老师就是开发者之一……还是挺激动…

    2025年3月8日 编程技术
    200
  • 怎样使用nodejs更改项目端口号

    这次给大家带来怎样使用nodejs更改项目端口号,使用nodejs更改项目端口号的注意事项有哪些,下面就是实战案例,一起来看一下。 在项目中加入文件:ServerConf var ServerConf= { ApiHost: “” //后台…

    2025年3月8日
    200
  • 如何使用js中async函数

    这次给大家带来如何使用js中async函数,使用js中async函数的注意事项有哪些,下面就是实战案例,一起来看一下。 一、终极解决 异步操作是 JavaScript 编程的麻烦事,麻烦到一直有人提出各种各样的方案,试图解决这个问题。 从最…

    编程技术 2025年3月8日
    200
  • 怎样优化js async函数

    这次给大家带来怎样优化js async函数,优化js async函数的注意事项有哪些,下面就是实战案例,一起来看一下。 首先,你需要了解Promise Promise是使用async/await的基础,所以你一定要先了解Promise是做什…

    编程技术 2025年3月8日
    200
  • web3.js增加eth.getRawTransactionByHash(txhash)方法步骤

    这篇文章主要介绍了web3.js增加eth.getrawtransactionbyhash(txhash)方法步骤,需要的朋友可以参考下 eth_getRawTransactionByHash https://ethereum.stacke…

    编程技术 2025年3月8日
    200
  • nodejs简单访问及操作mysql数据库的方法示例

    这篇文章主要介绍了nodejs简单访问及操作mysql数据库的方法,结合实例形式分析了nodejs创建mysql连接、执行sql语句及关闭连接等相关操作技巧,需要的朋友可以参考下 本文实例讲述了nodejs简单访问及操作mysql数据库的方…

    编程技术 2025年3月8日
    200
  • nodejs实现的简单web服务器功能示例

    这篇文章主要介绍了nodejs实现的简单web服务器功能,结合实例形式分析了nodejs构建web服务器的相关监听、响应、数据处理等操作技巧,需要的朋友可以参考下 本文实例讲述了nodejs实现的简单web服务器功能。分享给大家供大家参考,…

    编程技术 2025年3月8日
    200
  • nodejs实现连接mongodb数据库的方法示例

    这篇文章主要介绍了nodejs实现连接mongodb数据库的方法,结合实例形式分析了nodejs针对mongodb数据库的简单连接、查询及关闭等操作技巧,需要的朋友可以参考下 本文实例讲述了nodejs实现连接mongodb数据库的方法。分…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论