1.
setTimeout(()=>{
console.log('setTimeout')
})
let p1 = new Promise((resolve) => {
console.log('Promise1')
resolve('Promise2')
})
p1.then((res) => {
console.log(res)
})
console.log(1)
同步优先,异步靠边
setTimeout 和 then 方法都是异步 先不看
resolve('Promise2') 的函数是
.then((res) => {
console.log(res)
})
所以,是 Promise1 1 Promise2 setTimeout
.then((res) => {
console.log(res)
}) 里的 res 是形参,实参是 Promise2
2.
new Promise(resolve => {
console.log(1);
resolve(3);
Promise.resolve().then(()=>console.log(4))
}).then(num => {
console.log(num)
})
console.log(2)
顺序:1,2,4,3 不是 1,2,3,4
输出1 然后就是 2
通俗地说,Promise 函数,走一步,就跳出来 走后面 后面走完,再回来 Promise 内部,执行 resolve 和 then
重点说 3,4 的顺序:
当Promise直接resolve的时候,表示着在当前这一轮执行,这里就可以看作成一个同步的事件
Promise.resolve().then(()=>console.log(4)) 的优先级比 resolve(3) 高
3.此题及以后 不是考顺序 而是原理
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 的 .then
或者 .catch
可以被调用多次,但这里 Promise 构造函数只执行一次。或者说 promise 内部状态一经改变,并且有了一个值,那么后续每次调用 .then
或者 .catch
都会直接拿到该值。