基本使用
const mypro = new Promise((resolve,reject)=>{
resolve(成功了)
reject(失败了)
// 注意 结果只会更改一次,一旦改变立刻冻结。不会在发生第二次改变。
})
API
-
Promise.resolve()
快速创建一个成功的Promise
实例对象 -
Promise.reject()
快速创建一个失败的Promise
实例对象 -
Promise.all([p1,p2,p3])
接受一个数组作为参数,数组成员均为promise
实例对象,返回一个promise
实例对象。如果数组中所有成员都resolve()
则成功,如果有一个成员reject
,则返回的promise
也是reject
const p1 = new Promise((resolve,reject) => {
resolve(1)
});
const p2 = Promise.resolve(2);
const p3 = Promise.reject(3);
// 如果promise都为resolve,则all的结果也是resolve
// 只要有一个不是reject,则all为reject
const all = Promise.all([p1,p2,p3])
all.then(value=>{
console.log(value);
}).catch(err => {
console.log('出错了 ' + err);
})
-
Promise.race([p1,p2,p3])
接受一个数组作为参数,数组成员均为promise
实例对象,返回一个promise
实例对象。数组中成员第一个执行完毕的结果将会作为返回promise对象的结果。
const p1 = new Promise((resolve,reject) => {
setTimeout(() => {
resolve(1)
}, 2000);
});
const p2 = Promise.resolve(2);
const p3 = Promise.reject(3);
// 取最先完成的promise结果
const all = Promise.race([p1,p2,p3])
all.then(value=>{
console.log(value);
}).catch(err => {
console.log('出错了 ' + err);
})
关于promise的几个问题
如何改变promise的状态
1. resolve() ---> (状态变为resolved)
2. reject() ---> (状态变为rejected)
3. 内部抛出异常 ---> (状态变为rejected)
给promise指定多个成功\失败的回调函数,都会调用吗?
- 当promise改变状态时,都会调用绑定的回调函数。
promise.then()
返回的新promise
状态由什么决定?
- 简单表达:由
then
指定的回调函数运行结果决定 - 详细表达:
- ① 如果抛出异常,新
promise
状态变为rejected
- ② 如果返回的是非
promise
,新promise变为resolve
,value
为返回的值 - ③ 如果返回一个
promise
,则返回的promise
的结果会成为新promise
的结果
- ① 如果抛出异常,新
promise如何串联多个操作任务?
- promise的then()返回一个新的promise,可以使用then()的链式调用
- 通过then()的链式调用串联多个同步\异步任务
// promise串联多个 同步|异步 任务
new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('异步任务1 开始');
resolve(1)
},1000)
}).then((value)=>{
console.log('异步任务1 结果:' + value);
console.log('同步任务2 开始');
return 2
})
.then((value)=>{
console.log('同步任务2 结果:' + value);
console.log('异步任务3 开始');
// 如果是异步任务 则需要用promise对象来返回其值
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(3)
},1000)
})
})
.then((value)=>{
// 1s后输出 3
console.log('异步任务3 结果:' + value);
})
promise错误的穿透
- 如果promise的状态变成reject,不会跳过then方法直接调用catch,而是在then中逐层传递错误信息,直达catch捕获。相当于then的第二个参数被执行了,执行的默认值就是
err=>Promise.reject(err)
如何中断promise链
- 返回一个pending状态的promise即可。
.then(()=>{
return new Promise(()=>{})
}).then(()=>{
console.log('我不会被执行!!!')
})