1

const promise = new Promise((resolve, reject) => {
  console.log(1)
  console.log(2)
})
promise.then(() => {
  console.log(3)
})
console.log(4)
1
2
4

注意这里没有调用 resolvereject,所以 then 不会执行。

2

const promise1 = new Promise((resolve, reject) => {
  console.log("promise1")
  resolve("resolve1")
})
const promise2 = promise1.then((res) => {
  console.log(res)
})
console.log("1", promise1)
console.log("2", promise2)
promise1
1 Promise { <resolved>: 'resolve1' }
2 Promise { <pending> }
resolve1

3

const promise = new Promise((resolve, reject) => {
  console.log(1)
  setTimeout(() => {
    console.log("timerStart")
    resolve("success")
    console.log("timerEnd")
  }, 0)
  console.log(2)
})
promise.then((res) => {
  console.log(res)
})
console.log(4)
1
2
4
timerStart
timerEnd
success

4

Promise.resolve().then(() => {
  console.log("promise1")
  const timer2 = setTimeout(() => {
    console.log("timer2")
  }, 0)
})
const timer1 = setTimeout(() => {
  console.log("timer1")
  Promise.resolve().then(() => {
    console.log("promise2")
  })
}, 0)
console.log("start")
start
promise1
timer1
promise2
timer2

5

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

promise 的状态一旦改变,就不会再变。

6

Promise.resolve(1).then(2).then(Promise.resolve(3)).then(console.log)
1

then 方法接受的参数如果不是函数,会发生值穿透, 且只保留最初的穿透值

7

const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("success")
  }, 1000)
})
const promise2 = promise1.then(() => {
  throw new Error("error!!!")
})
console.log("promise1", promise1)
console.log("promise2", promise2)
setTimeout(() => {
  console.log("promise1", promise1)
  console.log("promise2", promise2)
}, 2000)
promise1 Promise { <pending> }
promise2 Promise { <pending> }
promise1 Promise { <resolved>: success }
promise2 Promise { <rejected>: Error: error!!! }

thencatch 中抛出错误,会返回一个新的 promise,且状态为 rejected

8

Promise.resolve(1)
  .then((res) => {
    console.log(res)
    return 2
  })
  .catch((err) => {
    return 3
  })
  .then((res) => {
    console.log(res)
  })
1
2

then 方法中返回的值会被 下一个then 方法接收

9

Promise.resolve()
  .then(() => {
    return new Error("error!!!")
  })
  .then((res) => {
    console.log("then: ", res)
  })
  .catch((err) => {
    console.log("catch: ", err)
  })
then: Error: error!!!

10

const promise = Promise.resolve().then(() => {
  return promise
})
promise.catch(console.err)
TypeError: Chaining cycle detected for promise #<Promise>

thencatch 返回的值不能是 promise 本身,否则会造成死循环。

11

Promise.reject("err!!!")
  .then(
    (res) => {
      console.log("success", res)
    },
    (err) => {
      console.log("error", err)
    },
  )
  .catch((err) => {
    console.log("catch", err)
  })
error err!!!

then 方法中,第二个参数就是用于捕获 reject 结果的, 这个参数捕获后就不需要触发接下来的 catch 方法了。

12

Promise.resolve("1")
  .then((res) => {
    console.log(res)
  })
  .finally(() => {
    console.log("finally")
  })
Promise.resolve("2")
  .finally(() => {
    console.log("finally2")
    return "我是finally2返回的值"
  })
  .then((res) => {
    console.log("finally2后面的then函数", res)
  })
1
finally2
finally
finally2后面的then函数 2

第一个 Promise 的 finally 方法必须等待前面的 then 方法执行完

13

function runAsync(x) {
  const p = new Promise((r) => setTimeout(() => r(x, console.log(x)), 1000))
  return p
}
 
Promise.all([runAsync(1), runAsync(2), runAsync(3)]).then((res) => console.log(res))
1
2
3
[1, 2, 3]

14

function runAsync(x) {
  const p = new Promise((r) => setTimeout(() => r(x, console.log(x)), 1000))
  return p
}
function runReject(x) {
  const p = new Promise((res, rej) =>
    setTimeout(() => rej(`Error: ${x}`, console.log(x)), 1000 * x),
  )
  return p
}
Promise.all([runAsync(1), runReject(4), runAsync(3), runReject(2)])
  .then((res) => console.log(res))
  .catch((err) => console.log(err))
1
3
2
Error: 2
4

Promise.all 中只要有一个 Promise 对象 reject,那么就会立即触发 Promise.allcatch 方法。

15

function runAsync(x) {
  const p = new Promise((r) => setTimeout(() => r(x, console.log(x)), 1000))
  return p
}
Promise.race([runAsync(1), runAsync(2), runAsync(3)])
  .then((res) => console.log("result: ", res))
  .catch((err) => console.log(err))
1
result: 1
2
3

Promise.race 方法会返回最先执行完的 Promise 对象的值。

16

function runAsync(x) {
  const p = new Promise((r) => setTimeout(() => r(x, console.log(x)), 1000))
  return p
}
function runReject(x) {
  const p = new Promise((res, rej) =>
    setTimeout(() => rej(`Error: ${x}`, console.log(x)), 1000 * x),
  )
  return p
}
Promise.race([runReject(0), runAsync(1), runAsync(2), runAsync(3)])
  .then((res) => console.log("result: ", res))
  .catch((err) => console.log(err))
0
Error: 0
1
2
3

17

async function async1() {
  console.log("async1 start")
  await async2()
  console.log("async1 end")
}
async function async2() {
  console.log("async2")
}
async1()
console.log("start")
async1 start
async2
start
async1 end

18

async function async1() {
  console.log("async1 start")
  await async2()
  console.log("async1 end")
  setTimeout(() => {
    console.log("timer1")
  }, 0)
}
async function async2() {
  setTimeout(() => {
    console.log("timer2")
  }, 0)
  console.log("async2")
}
async1()
setTimeout(() => {
  console.log("timer3")
}, 0)
console.log("start")
async1 start
async2
start
async1 end
timer2
timer3
timer1

19

async function async1() {
  console.log("async1 start")
  await new Promise((resolve) => {
    console.log("promise1")
  })
  console.log("async1 success")
  return "async1 end"
}
console.log("srcipt start")
async1().then((res) => console.log(res))
console.log("srcipt end")
script start
async1 start
promise1
script end

20

async function async1() {
  console.log("async1 start")
  await new Promise((resolve) => {
    console.log("promise1")
    resolve("promise1 resolve")
  }).then((res) => console.log(res))
  console.log("async1 success")
  return "async1 end"
}
console.log("srcipt start")
async1().then((res) => console.log(res))
console.log("srcipt end")
script start
async1 start
promise1
script end
promise1 resolve
async1 success
async1 end

21

async function async1() {
  console.log("async1 start")
  await async2()
  console.log("async1 end")
}
 
async function async2() {
  console.log("async2")
}
 
console.log("script start")
 
setTimeout(function () {
  console.log("setTimeout")
}, 0)
 
async1()
 
new Promise((resolve) => {
  console.log("promise1")
  resolve()
}).then(function () {
  console.log("promise2")
})
console.log("script end")
script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout

22

async function async1() {
  await async2()
  console.log("async1")
  return "async1 success"
}
async function async2() {
  return new Promise((resolve, reject) => {
    console.log("async2")
    reject("error")
  })
}
async1().then((res) => console.log(res))
async2
Uncaught (in promise) error

23

async function async1() {
  await Promise.reject("error!!!").catch((e) => console.log(e))
  console.log("async1")
  return Promise.resolve("async1 success")
}
async1().then((res) => console.log(res))
console.log("script start")
script start
error!!!
async1
async1 success

注意 await 的是 catch

24

const first = () =>
  new Promise((resolve, reject) => {
    console.log(3)
    let p = new Promise((resolve, reject) => {
      console.log(7)
      setTimeout(() => {
        console.log(5)
        resolve(6)
        console.log(p)
      }, 0)
      resolve(1)
    })
    resolve(2)
    p.then((arg) => {
      console.log(arg)
    })
  })
first().then((arg) => {
  console.log(arg)
})
console.log(4)
3
7
4
1
2
5
Promise { <resolved>: 1 }

先遇到哪个 then 就先执行哪个 then

25

const async1 = async () => {
  console.log("async1")
  setTimeout(() => {
    console.log("timer1")
  }, 2000)
  await new Promise((resolve) => {
    console.log("promise1")
  })
  console.log("async1 end")
  return "async1 success"
}
console.log("script start")
async1().then((res) => console.log(res))
console.log("script end")
Promise.resolve(1)
  .then(2)
  .then(Promise.resolve(3))
  .catch(4)
  .then((res) => console.log(res))
setTimeout(() => {
  console.log("timer2")
}, 1000)
script start
async1
promise1
script end
1
timer2
timer1

注意值渗透

26

const p1 = new Promise((resolve) => {
  setTimeout(() => {
    resolve("resolve3")
    console.log("timer1")
  }, 0)
  resolve("resovle1")
  resolve("resolve2")
})
  .then((res) => {
    console.log(res) // resolve1
    setTimeout(() => {
      console.log(p1)
    }, 1000)
  })
  .finally((res) => {
    console.log("finally", res)
  })
resolve1
finally resolve1
timer1
Promise { <resolved> resolve1}

27

console.log("1")
 
setTimeout(function () {
  console.log("2")
  process.nextTick(function () {
    console.log("3")
  })
  new Promise(function (resolve) {
    console.log("4")
    resolve()
  }).then(function () {
    console.log("5")
  })
})
process.nextTick(function () {
  console.log("6")
})
new Promise(function (resolve) {
  console.log("7")
  resolve()
}).then(function () {
  console.log("8")
})
 
setTimeout(function () {
  console.log("9")
  process.nextTick(function () {
    console.log("10")
  })
  new Promise(function (resolve) {
    console.log("11")
    resolve()
  }).then(function () {
    console.log("12")
  })
})
1
7
6
8
2
4
3
5
9
11
10
12

28

console.log(1)
 
setTimeout(() => {
  console.log(2)
})
 
new Promise((resolve) => {
  console.log(3)
  resolve(4)
}).then((d) => console.log(d))
 
setTimeout(() => {
  console.log(5)
  new Promise((resolve) => {
    resolve(6)
  }).then((d) => console.log(d))
})
 
setTimeout(() => {
  console.log(7)
})
 
console.log(8)
1
3
8
4
2
5
6
7

29

console.log(1)
 
setTimeout(() => {
  console.log(2)
  Promise.resolve().then(() => {
    console.log(3)
  })
})
 
new Promise((resolve, reject) => {
  console.log(4)
  resolve(5)
}).then((data) => {
  console.log(data)
})
 
setTimeout(() => {
  console.log(6)
})
 
console.log(7)
1
4
7
5
2
3
6

30

Promise.resolve()
  .then(() => {
    console.log("1")
    throw "Error"
  })
  .then(() => {
    console.log("2")
  })
  .catch(() => {
    console.log("3")
    throw "Error"
  })
  .then(() => {
    console.log("4")
  })
  .catch(() => {
    console.log("5")
  })
  .then(() => {
    console.log("6")
  })
1
3
5
6

31

setTimeout(function () {
  console.log(1)
}, 100)
 
new Promise(function (resolve) {
  console.log(2)
  resolve()
  console.log(3)
}).then(function () {
  console.log(4)
  new Promise((resove, reject) => {
    console.log(5)
    setTimeout(() => {
      console.log(6)
    }, 10)
  })
})
console.log(7)
console.log(8)
2
3
7
8
4
5
6
1