TOC
ECMAScript 6 简介
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
Promise 对象
Promise
- 基本用法:
Promise
是异步编程的一种解决方案。所谓Promise
,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise
是一个对象,从它可以获取异步操作的消息。Promise
提供统一的API
,各种异步操作都可以用同样的方法进行处理。const promise = new Promise(function(resolve, reject) { // ... some code if (/* 异步操作成功 */){ resolve(value); } else { reject(error); } }); promise .then(function(data) { // success }) .catch(function(err) { // error }) .finally(() => { //··· });
- 特点:
-
对象的状态不受外界影响。
Promise
对象代表一个异步操作,有三种状态:pending
(进行中)fulfilled
(已成功)rejected
(已失败)
只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
-
一旦状态改变,就不会再变,任何时候都可以得到这个结果。
Promise
对象的状态改变,只有两种可能:pending
–>fulfilled
pending
–>rejected
只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为
resolved
(已定型)。
-
- 缺点:
- 无法取消
Promise
,一旦新建它就会立即执行,无法中途取消 - 如果不设置回调函数,
Promise
内部抛出的错误,不会反应到外部 - 当处于
pending
状态时,无法得知目前进展到哪一个阶段
- 无法取消
Promise.all(),
- 基本用法:
Promise.all()
方法用于将多个Promise
实例,包装成一个新的Promise
实例。const p = Promise.all([p1, p2, p3]);
p的状态由p1、p2、p3决定,分成两种情况:
- 只有p1、p2、p3的状态都变成
fulfilled
,p的状态才会变成fulfilled
,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。 - 只要p1、p2、p3之中有一个被
rejected
,p的状态就变成rejected
,此时第一个被reject
的实例的返回值,会传递给p的回调函数。
- 只有p1、p2、p3的状态都变成
Promise.allSettled()
- 基本用法:
Promise.allSettled()
方法接受一组Promise
实例作为参数,包装成一个新的Promise
实例。只有等到所有这些参数实例都返回结果,不管是fulfilled
还是rejected
,包装实例才会结束。
Promise.race()
- 基本用法:
Promise.race()
方法同样是将多个Promise
实例,包装成一个新的Promise
实例。const p = Promise.all([p1, p2, p3]);
只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的
Promise
实例的返回值,就传递给p的回调函数。
Promise.any()
-
基本用法:
Promise.any()
方法接受一组Promise
实例作为参数,包装成一个新的Promise
实例。只要参数实例有一个变成fulfilled
状态,包装实例就会变成fulfilled
状态;如果所有参数实例都变成rejected
状态,包装实例就会变成rejected
状态。Promise.any()
跟Promise.race()
区别:就是不会因为某个Promise
变成rejected
状态而结束。Promise.any(promises).then( (first) => { // Any of the promises was fulfilled. }, (error) => { // All of the promises were rejected. } );
Promise.resolve()
- 基本用法:
有时需要将现有对象转为
Promise
对象,Promise.resolve()
方法就起到这个作用。Promise.resolve('foo') // 等价于 new Promise(resolve => resolve('foo'))
Promise.reject()
- 基本用法:
Promise.reject(reason)
方法也会返回一个新的Promise
实例,该实例的状态为rejected
。const p = Promise.reject('出错了'); // 等同于 const p = new Promise((resolve, reject) => reject('出错了')) p.then(null, function (s) { console.log(s) }); // 出错了
「下次一定」
下次一定
使用微信扫描二维码完成支付