面试遇到的promise的执行顺序问题,在这里,总结下。之前博客的账号忘记了,新建了一个。
const promise = new Promise((resolve, reject) => {
console.log(1);
resolve();
console.log(2);
})
promise.then(() => {
console.log(4);
})
console.log(5);
// 运行结果是: 1, 2, 5, 4
// 解释: promise的构造函数是同步执行, promise.then中的函数是异步执行。
const promise = new Promise((resolve, reject) => {
resolve('success1')
reject('error')
resolve('success2')
})
promise.then((res) => {
console.log('then: ', res)
}).catch((err) => {
console.log('catch: ', err)
})
// 运行结果: then: success1
// 解释: 构造函数中的 resolve 或 reject 只有第一次执行有效, 多次调用没有任何
// 作用。 promise 状态一旦改变则不能再变。
// promise 有 3 种状 态: pending、 fulfilled 或 rejected。
// 状态改变只能是 pending - > fulfilled 或者 pending - > rejected,
// 状态一旦改变则不能再变。
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('once')
resolve('success')
}, 1000)
})
const start = Date.now()
promise.then((res) => {
console.log(res, Date.now() - start)
})
promise.then((res) => {
console.log(res, Date.now() - start)
})
// 运行结果: once
// success 1005
// success 1007
// 解释: promise 的.then 或者.catch 可以被调用多次, 但这里 Promise 构造函数
// 只执行一次。 或者说 promise 内部状态一经改变, 并且有了一个值, 那么后续每
// 次调用.then 或者.catch 都会直接拿到该值。
console.log('start');
new Promise(function (resolve, reject) {
setTimeout(function () { //定时器模拟异步