热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

20170702异步编程之Promise

1.Promise的含义Promise是异步编程的一种解决方案Promise实例代表一个异步操作,从它可以获取异步操作的消息Promise实例有三种状态:

1.Promise的含义

  • Promise是异步编程的一种解决方案

  • Promise实例代表一个异步操作,从它可以获取异步操作的消息

  • Promise实例有三种状态:

    • Pending:进行中

    • Resolved:已完成

    • Rejected:已失败

  • Promise实例的状态只能由 Pending->Resolved, Pending->Rejected。一旦Promise实例的状态发生改变,就不会再发生变化,任何时候都可以得到这个结果

  • 为什么要使用Promise:通过Promise,可以将一步操作以同步操作的流程表达出来,可以避免层层嵌套的回调函数(回调地域),并且Promise提供了统一的接口,使得控制异步操作更加容易

2.Promise构造函数

Promise是一个构造函数,用来生成Promise实例

var promise = new Promise(function(resolve, reject)){// ... do somethingif (/*异步操作成果*/) {resolve(value)} else { /*异步操作失败*/reject(error)}
}

  • Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolvereject。它们是两个函数,由 Javascript 引擎提供,不用自己部署。

  • resolve函数的作用是,将Promise实例的状态从“未完成”变为“成功”(即从 Pending 变为 Resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去

  • reject函数的作用是,将Promise实例的状态从“未完成”变为“失败”(即从 Pending 变为 Rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去**

Promise.prototype.then()

Promise实例生成以后,可以用then方法分别指定Resolved状态和Reject状态的回调函数。

var promise = new Promise(function(resolve, reject)){// ... do somethingif (/*异步操作成果*/) {resolve(value)} else { /*异步操作失败*/reject(error)}
}
promise.then(function(value) {// success
}, function(error) {// failure
});

  • then方法可以接受两个回调函数作为参数。第一个回调函数是Promise的状态变为Resolved时调用,第二个回调函数是Promise实例的状态变为Rejected时调用。其中,第二个函数是可选的,不一定要提供。

  • 这两个函数都接受Promise实例传出的值作为参数。(简单地说就是:上面的promise对象在处理异步操作的过程中,如果调用了resolve方法,则会将resolve的参数传递给then方法的第一个函数,如果调用了reject方法,这会将reject的参数传递给then方法的第二个函数)

clipboard.png

then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例),因此可以采用链式写法,即then方法后面在调用另一个then方法

clipboard.png

上面的代码使用then方法,依次指定了两个回调函数。第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。(实际上是第一个then方法返回了一个Promise实例,在该实例中调用了resolve方法,而json.post则是作为resolve的参数)


clipboard.png

上面代码中,第一个then方法指定的回调函数,返回的是另一个Promise实例,则第一个then方法会直接将该Promise实例返回

Promise.prototype.catch()

该方法是.then(undefined, onRejected)的别名,用于指定发生错误时的回调函数。

promise.then(function(data) {console.log('success');
}).catch(function(error) {console.log('error', error);
});

promise对象的错误,会一直向后传递,直到被捕获。即错误总会被下一个catch所捕获。then方法指定的回调函数,若抛出错误,也会被下一个catch捕获。catch中也能抛错,则需要后面的catch来捕获。

sendRequest('test.html').then(function(data1) {//do something
}).then(function (data2) {//do something
}).catch(function (error) {//处理前面三个Promise产生的错误
});

Promise.all()

该方法用于将多个Promise实例,包装成一个新的Promise实例

// p1,p2,p3都是promise实例
var p = Promise.all([p1, p2, p3]);

新的Promise实例的状态由三个promise实例共同决定

  • 当三个promise实例的状态都变为fulfilled,p的状态才会变为fulfilled,并将三个promise返回的结果,按照参数顺序存入数组,传给p的回调函数

  • 当p1, p2, p3其中之一状态变为rejected,p的状态也会变为rejected,并把第一个被reject的promise的返回值,传给p的回调函数

Promise..race()

该方法用于将多个Promise实例,包装成一个新的Promise实例

// p1,p2,p3都是promise实例
var p = Promise.race([p1, p2, p3]);

新的Promise实例的状态由三个promise实例共同决定

  • 当p1, p2, p3其中之一状态发生改变(变为fulfilled或者rejected),p的状态也会随之改变,并把第一个改变状态的promise的返回值,传给p的回调函数

Promise.resolve()

Promise.resolve方法的参数分为四种情况

  • 参数是一个Promise实例

如果参数是Promise实例,那么Promise.resolve将不做任何修改、原封不动地返回这个实例。

  • 参数是一个thenable对象

let thenable = {then: function(resolve, reject) {resolve(42);}
};let p1 = Promise.resolve(thenable);
p1.then(function(value) {console.log(value); // 42
});

Promise.resolve方法会将这个对象转为Promise对象,然后就立即执行thenable对象的then方法。

  • 参数不是具有then方法的对象,或根本就不是对象

如果参数是一个原始值,或者是一个不具有then方法的对象,则Promise.resolve方法返回一个新的Promise对象,状态为Resolved。

Promise.resolve('Success');/*******等同于*******/
new Promise(function (resolve) {resolve('Success');
});

  • 不带任何参数

直接返回一个Resolved状态的Promise对象。

Promise.resolve('Success');/*******等同于*******/
new Promise(function (resolve) {resolve();
});

Promise.reject()

Promise.reject(new Error('error'));/*******等同于*******/
new Promise(function (resolve, reject) {reject(new Error('error'));
});

这段代码会让这个Promise对象立即进入rejected状态,并将错误对象传递给then指定的onRejected回调函数。

参考资料

ECMAScript 6 入门




推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
author-avatar
agree_6398026768
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有