Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
三种状态
- pending(就绪)
- fullfilled(成功)
- rejected(失败)
两种状态转变
- pending----> fullfilled
- pending----> rejected
这两种状态之一一旦发生,状态就凝固了,不再改变了,我们称之为resolved
resolve rejecte
- resolve 作用在 pending----> fullfilled
- reject 作用在 pending----> rejected
.then .catch
then方法指定的回调函数在同步任务执行完后才执行
function PromiseTest() {
return new Promise((resolve, reject) => {
resolve("success")
})
}
var p = new PromiseTest()
p.then(val => {
console.log(val);
})
let a = 1;
console.log(a);
console.log("同步任务");
/*output:
1
同步任务
success*/
Promise.all
- 接收一个数组作为参数,而且数组中每一个都是一个Promise实例。
- 也可以不是数组,但必须有Iterator接口
const p = Promise.all([p1,p2,p3]);
由如下两种情况
- p1 , p2 , p3 都是fullfilled,则p的状态为fullfilled,且p1 p2 p3的返回值形成一个数组,传递给p的回调函数
- p1 p2 p3有一个为rejected,p的状态为rejected,此时第一个为rejected的返回值会传递给p的回调函数
Promise.resolve Promise.reject
相当于一个语法糖,可以简化代码
Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))
const p = Promise.reject('出错了');
// 等同于
const p = new Promise((resolve, reject) => reject('出错了'))
p.then(null, function (s) {
console.log(s)
});
// 出错了