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 // 2setTimeout也相当于“异步执行了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 1002process.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