什么是promise
Promise 对象用于表示一个异步操作的最终状态(完成或失败)以及其返回的值
Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息。
同步?异步?
同步任务会阻塞程序运行
异步任务不会阻塞程序执行
示例:
function f() {
return new Promise(resolve => {
setTimeout(function () {
resolve();
}, 1000);
})
}
f()
.then(function () {
console.log(1);
return f();
})
.then(function () {
console.log(2);
return f();
})
.then(function () {
console.log(3);
})
Promise
信任问题
-
解决了回调地狱、信任问题;
-
promise可以有效防止回调函数控制反转的问题,一旦被确定为成功或者失败,就不能再被更改
Promise.then(resolve, reject)
resolve 和 reject 都是异步的,没办法通过 try-catch 语句捕获错误
示例:
function f(a) {
return new Promise((resolve, reject) => {
if(a){
resolve("成功");
}
else {
reject("失败");
}
})
}
// 此句说明,我们可以将一个表达式放进去,或者放一个数值,经过处理 再在f函数体内调用成功或错误的函数
f(false)
.then((data) => console.log(data), (data) => console.log(data));
可以选择Promise自带的.catch
方法捕获错误
function f(a) {
return new Promise((resolve, reject) => {
if(a){
resolve("成功");
}
else {
reject("失败");
}
})
}
// 如果上一个执行函数未执行其中函数,catch 方法可以获取到上一个执行函数的 reject 函数,并且执行
f(false)
.then((data) => console.log(data))
.catch(e => {
console.log(e);
})
Promise 的三种状态
-
pending:进行中
-
fulfilled:成功
-
rejected:失败
状态的改变不可逆,一但决议就不能再修改
Promise.all
该方法可以把多个 promise 实例包装成一个新的 promise 实例
Promise.all([promise1,promise2]):Promise
--- 最终返回 Promise 实例;
-
全部加载成功 则返回所有promise实例中
resolve()
回来带的参数,按数组中一一对应的顺序所集合的数组 -
若任意有一个失败 ,立即决议失败,但会执行成功的实例,后将失败的 promise 实例(
reject()
中参数)传递给我们 -
若
Promise.all([])
中,数组为空数组,则立即决议为成功执行resolve()
Promise.race
只要有一个 Promise 实例被决议,则返回该实例带来的resolve()
或reject()
的参数
Promise.resolve 方法,Promise.reject 方法
-
如果 resolve 方法中是一个值的话,则返回一个新的 Promise 对象,且它的状态为 fulfilled
-
如果 resolve 方法中是一个包含 then 方法的对象时(又称 thenable 对象),则返回一个新的 Promise 对象,且它的状态为 fulfilled
-
如果接受的是一个 Promise 实例,则返回这个 Promise 实例
Promise.reject 方法类似,但就是状态为 rejected
小技巧
同步任务要比异步任务先执行
网友评论