- promise只有三种状态pending,resolved,rejected,且某时刻下一定处于3者之一。
- 每一个promise实例的状态改变只有两种情况pending->resolved,pending->rejected一旦发生其中之一,状态就会凝固不会在发生变化。即便以后再次改变。
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 就不会再发生状态改变。
promise 可以链式调用。提起链式调用我们通常会想到通过 return this 实现,不过 Promise 并不是这样实现的。promise 每次调用 .then 或者 .catch 都会返回一个新的 promise,(即使你返回了某个类型的值,也会被包裹为resolved的参数)从而实现了链式调用。
Promise.resolve(1) .then((res) => { console.log(res) return 2 }) .catch((err) => { return 3 }) .then((res) => { console.log(res) }) // 1 // 2
setTimeout也相当于“异步执行了1次”, .then()是异步调用的,当状态改变为resolved,或者rejected,之后多次调用then返回的值不会改变
const promise = new Promise((resolve, reject) => { setTimeout(() => { console.log('once') resolve('success') }, 1000) }) console.log("break;") const start = Date.now() promise.then((res) => { console.log(res, Date.now() - start) }) promise.then((res) => { console.log(res, Date.now() - start) }) // break; //once // success 1001 // success 1002
process.nextTick 和 promise.then 都属于 microtasks,而 setImmediate 属于 macrotasks,在事件循环的 check 阶段执行。事件循环的每个阶段(macrotasks)之间都会执行 microtasks,事件循环的开始会先执行一次 microtasks。
process.nextTick(() => { console.log('nextTick') }) Promise.resolve() .then(() => { console.log('then') }) setImmediate(() => { console.log('setImmediate') }) console.log('end') // end // nextTick // then //setImmediate