1. promise 是 JavaScript 语言中异步编程的解决方案,它提供了一种更优雅、合理的方法来处理异步任务,比起传统的回调函数和事件处理。Promise 让异步编程更加容易处理,比如,你可以用它快速地同时处理多个异步任务,而不需要处理嵌套的回调函数。
2. promise 是一种对象,它以一个抽象的方式封装了异步任务的处理状态。它的状态分为三种:pending(进行中)、fulfilled(已完成)、和 rejected(已失败)。在异步任务完成之后,Promise会根据执行成功还是失败,进入不同的状态。
3. 使用 Promise 时,我们可以定义两个回调函数,一个是处理任务成功的回调函数,另一个处理任务失败的回调函数。在 Promise 构造函数的参数中,第一个参数是一个函数,它接收两个参数,一个用于处理成功的回调函数,一个用于处理失败的回调函数:
```
var promise = new Promise(function(resolve, reject) {
// 这里正式执行异步任务
// 任务成功,调用resolve方法
// 任务失败,调用reject方法
});
```
4. Promise 对象还提供了一组静态方法,用于处理多个Promise对象。Promise.all()方法接收一个Promise对象组成的数组,所有Promise对象执行完毕后,返回一个新的Promise对象。Promise.race()方法也接收一个Promise数组,返回一个包含第一个完成任务的Promise对象:
```
Promise.all([promise1, promise2, promise3])
.then(function(results) {
// 这里的results就是promise1,promise2,promise3的执行结果
});
Promise.race([promise1, promise2, promise3])
.then(function(result) {
// 这里的result就是第一个完成任务的Promise对象的执行结果
});
```
5. Promise 对象还提供了一些实例方法,比如 then()、catch()、resolve()、reject()等。这些方法的作用是:then()方法用于处理任务成功的回调函数;catch()方法用于处理任务失败的回调函数;resolve()用于向then()传递确定成功的结果;reject()用于向catch()传递失败的结果。
```
promise.then(function(result) {
// 这里做一些正常的处理
})
.catch(function(error) {
// 这里处理错误
});
```
6. Promise 还提供了一些实用的实例方法,比如:Promise.resolve()可以将普通的任务变换为 Promise 任务,Promise.reject()可以直接抛出异常,Promise.race()可以让多个Promise任务竞争,只有竞争成功的最先完成,Promise.all()可以同时发起多个Promise任务,这些任务都执行成功,则返回结果,否则就会抛出异常:
```
Promise.resolve(value);
Promise.reject(reason);
Promise.race([tasks]);
Promise.all([tasks]);
```
7. Promise 已被标准化,它可以用于跨浏览器等多种环境中,实现良好的异步任务处理。此外,Promise 对象还支持基于Promise的控制流,比如可以将Promise对象连接形成一个管道,Promise 还支持 async、await 等功能,以更加优雅、合理的方式来处理异步任务。
一、Promise的出现
1.Promise特指ECMAScript 6(ES6)中对事件回调的进一步抽象,有了它,可以使异步编程异常方便。Promise出现之前,异步编程常常采用回调函数的形式,一层层嵌套回调函数,称为\"回调地狱\",写程序也别有一番滋味。
2.Promise就是为了解决异步编程中回调地狱这一问题设计出来的,它是一种特殊的对象,可以让我们十分方便管理异步操作,允许代码以同步的方式执行,并且消除层层嵌套的回调函数。
二、Promise的定义
1.Promise一般定义为一个类,其有三种状态:pending(正在进行)、fulfilled(已成功)和rejected(已失败),每个状态都会被Promise控制并且只能朝一个方向转变。Promise对象实际上是一个包装对象,里面包裹着异步操作的处理结果,当异步操作完成后,Promise的状态会由pending转变为fulfilled或者rejected。
2.Promise的实例通过调用类的构造函数来实例化,构造函数有两个参数:一个是resolver函数,另一个是rejecter函数。resolver 函数会接受一个参数,它是一个已经在新建的Promise 上调用resolve()来解决的一个值,而rejecter函数会接受一个reason参数,reason是一个指出Promise失败的原因,它也会在新建Promise上调用reject()来失败。
三、Promise的创建
1.Promise也是一个构造函数,必须使用new来调用它才能成功创建一个Promise实例,作为构造函数的参数传递给它的是一个函数,该函数有两个参数,一个是可以用来表示promise成功的参数,另一个是可以用来表示promise失败的参数,这两个参数也都是函数。
2.通过Promise.resolve或者Promise.reject可以创建直接返回成功或失败状态的Promise,函数参数可以传入任意类型的参数,包括Promise类型、函数等。另外,Promise.all可以让我们把多个Promise对象包装成一个新的Promise对象,它返回一个新的Promise对象,这个对象执行完所有异步操作后才会变成成功状态。
四、Promise的api
1.Promise中的then方法用来设置resolve返回值的处理函数,then的参数是一个回调函数,如果promise成功执行then回调函数,并将resolve时传递的参数作为then函数的参数。
2.Promise中的catch方法用来设置reject返回值的处理函数,catch的参数也是一个回调函数,如果promise失败执行catch回调函数,并将reject时传递的参数作为catch函数的参数。
3.Promise中的all方法用于将多个Promise实例包装成一个新的Promise实例,实现 Promise 的进一步封装,该方法接受一个Promise实例数组作为参数,当所有Promise实例都变为成功状态之后,返回的Promise实例才会变为成功状态。
五、Promise的使用
1.可以用Promise实现异步编程,可以用Promise来解决AJAX、DOM事件、定时器等异步编程问题,不再需要使用层层嵌套的回调函数,只需要使用then方法就可以串联起多个异步操作,有效地解决异步编程的问题。