本文记录了 Promise 使用中容易被忽视但又重要的细节。
constructor
function testConstructor() {
console.log('1. Init');
const promise = new Promise((resolve) => {
resolve('4. Promise Then');
// Promise 构造函数传进的函数会立即执行
console.log('2. Call in Promise constructor paremeter');
});
promise.then((msg) => {
// Promise then 总会被异步调用
console.log(msg);
});
console.log('3. End');
}
testConstructor();
resolve then
function testThenRevoke() {
console.log('1. Init');
const promise = new Promise((resolve) => {
resolve('Resolve First');
// 只接受第一个 Resolve
resolve('Resove Second');
console.log('2. Call in Promise constructor');
});
promise.then((value) => {
console.log('Then First: ', value);
});
promise.then((value) => {
console.log('Then Second: ', value);
});
console.log('3. End');
};
testThenRevoke();
reject
function testReject() {
console.log('1. Init');
const promise = new Promise((resolve) => {
undefined.key;
console.log('Call in Promise constructor');
});
promise
.then(
function onFulfilled(value) {
console.log('Then onFulfilled: ', msg);
},
function onRejected(reason) {
console.log('3. Then onRejected: ' + reason);
// throw new Error(reason);
},
)
.catch((error) => {
// 传进 Promise catch 的回调将不会执行
// 因为 promise onRejected 默认会 throw new Error(reason);
console.log('Catch: ' + error);
});
console.log('2. End');
};
testReject();
Promise.resolve
function testPromiseResolve() {
const p1 = new Promise(function(resolve) {
console.log('resolve begin');
setTimeout(() => {
resolve(42);
}, 3000);
console.log('resolve end');
});
const p2 = Promise.resolve(42);
const p3 = Promise.resolve(p1);
console.log('p1 === p2: ', p1 === p2);
console.log('p1 === p3: ', p1 === p3);
}
testPromiseResolve();
cacel a promise
extract resolve or reject
function cacelPromise1() {
let mResolve;
const p1 = new Promise(function(resolve, reject) {
setTimeout(() => {
resolve('Fullfill after 3s');
}, 3000);
mResolve = resolve;
});
// mResolve('Fullfill at once');
p1.then((msg) => {
console.log(msg);
})
}
cacelPromise1();
Promise.race
// how to cacel a promise
function cacelPromise2() {
const p1 = new Promise(function(resolve, reject) {
setTimeout(() => {
resolve('Fullfill after 3s');
}, 300000);
});
const p2 = new Promise((resolve) => {
setTimeout(() => {
resolve('Ahead');
}, 100);
})
Promise.race([p1, p2]).then((value) => {
console.log(value);
})
}
cacelPromise2();