Promise
promise三种状态
- Fulfilled
- Rejected
- Pending
Promise.resolve
静态方法Promise.resolve(value)可以认为是new Promsie()的快捷方式,比如Promise.resolve(43);可以认为是以下代码的语法糖:
new Promise(function(resolve) {
resolve(43)
})
这段代码中的resolve(42);会让这个promise对象立即进入成功状态,该方法的返回值也是一个promise对象,我们可以像下面接着对其返回值进行.then调用。
Promise.resolve(43).then((value) => {console.log(value)})
Promise.resolve作为new Promise()的快捷方式,在进行promise对象的初始化或者编写测试代码的时候都非常方便。
Promise.reject
Promise.reject(error)是和Promise.resolve(value)类似的静态方法,是new Promise()方法的快捷方式。
比如Promise.reject(new Error(“出错了”))就是下面代码的语法糖形式。
new Promise((resolve, reject) => {
reject(new Error("出错了"));
})
Promise.reject(new Error("出错了")).catch(error => {
console.error(error);
})
它和Promise.resolve(value)的不同之处在于promise内调用的函数是reject而不是resolve,这在编写测试代码或者进行debug时说不定用得上。
promise chain (promise链)
function taskA() {
console.log("taskA");
}
function taskB() {
console.log("taskB");
}
function finalTask() {
console.log("finalTask");
}
function rejected(err) {
console.log(err);
}
Promise
.resolve()
.then(taskA)
.then(taskB)
.catch(rejected)
.then(finalTask);
上面的promise链执行顺序为:
若task出现异常时
function taskA() {
console.log("taskA");
throw new Errow("这是一个错误")
}
function taskB() {
console.log("taskB");
}
function finalTask() {
console.log("finalTask");
}
function rejected(err) {
console.log(err);
}
Promise
.resolve()
.then(taskA)
.then(taskB)
.catch(rejected)
.then(finalTask);
//最后结果为taskA 报错 finalTask
此时会跳过taskB,按照taskA -> rejected -> finalTask这个流程来处理
promise链中参数的传递
上面的例子中task都是独立的,只是简单被调用而已,这时如果taskA想给taskB传递一个参数该怎么办那?
function taskA(count) {
console.log("taskA", count);
return count;
}
function taskB(count) {
console.log("taskB", count + 1);
return count + 1;
}
function taskC(count) {
console.log("taskC", count * 2);
return count * 2;
}
Promise.resolve(1).then(taskA).then(taskB).then(taskC);
//最后结果为
//taskA 1
//taskB 2
//taskC 4
Promise的常用方法
- Promise.all([]).then(res => {}).catch(err => {}),该方法返回一个Promise实力,只有当[]中的所有promise完成后才会执行,一旦有一个promise被拒绝,则执行失败回调,catch方法会捕捉到首个被执行的reject函数。Promise.all获得的成功结果的数组里面的数据顺序和Promise.all接收到的数组顺序是一致的
- Promise.allSettled([]).then(results => {});当给定的promise数组中的所有promise被拒绝后会返回一个拒绝的promise数组,与[]一一对应。
- Promise.any([]).then().catch;当promise数组中有任意一个完成时就会终止,会忽略到所有被拒绝掉的promise,直到第一个promise完成。若传入所有的promise被拒绝则会执行拒绝回调
- Promise.race([]).then().catch();当promise数组中任意一个promise被拒绝或者成功,则会采用第一个promise作为他的返回值,但其余的promise还是会继续执行。