Promise易错点

xiaoxiao2021-02-28  34

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
转载请注明原文地址: https://www.6miu.com/read-2629975.html

最新回复(0)