Promise对象为异步而生,接受一个函数作为参数,该函数里放入需要在主线程上执行的代码。该段代码在执行时,Promise的状态为Pending。执行结束后,根据结果更改状态为Resolved或Rejected。
new Promise((resolve, reject) => { /* 在主线程里执行的代码 */});
状态需要调用resolve()或reject()方法更改:
new Promise((resolve, reject) => {
const random = Math.random();
if (random > 0.5) {
resolve();
} else {
reject();
}
});
resolve()和reject()方法都可以接收一个值作为参数,传递给then方法中的回调函数,供回调函数作为参数使用。
new Promise((resolve, reject) => {
const random = Math.random();
if (random > 0.5) {
resolve(random);
} else {
reject(new Error(random));
}
}).then(res => {
console.log('resolved:', res);
}).catch(err => {
console.log('rejected:', err);
});
在当前Promise对象中,当resolve或reject中的参数是一个Promise对象时,当前Promise的状态由参数中的Promise状态决定:
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error( '3秒之后promise1的状态由pending更新为rejected'));
}, 3000);
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(promise1);
console.log('1秒之后执行promise2,此时promise1还未reject,promise1 reject后promise2才能resolve');
}, 1000);
}).then(res => {
console.log('resolved:', res);
}).catch(err => {
console.log('rejected:', err);
});
如果需要链式调用,前一个then()方法的参数必须是一个函数,这样该函数执行后的返回值才能作为参数传入到后一个then()方法的回调函数中。
new Promise((resolve, reject) => {
const random = Math.random();
if (random > 0.5) {
resolve(random);
} else {
reject(new Error(random));
}
}).then(res => {
return (res * 10).toFixed(0);
}).then(res => {
console.log('resolved:', res);
}).catch(err => {
console.log('rejected:', err);
});
网友评论