关于串行promise的一个问题

现在用这样一段代码:

(() => {  return new Promise((resolve) => {
    setTimeout(() => {      console.log('task1 -> 3s')
      resolve()
    }, 3000);
  })
  .then(() => {
      setTimeout(() => {        console.log('task2 -> 2s')
        Promise.resolve()
      }, 2000);
  })
  .then(() => {
    setTimeout(() => {      console.log('task3 -> 1s')
    }, 1000);
  })
})()
输出的顺序是 task1 -> task3 -> task2

如果改成:

(() => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('task1 -> 3s')
      resolve()
    }, 3000);
  })
  .then(() => {
    return new Promise((resolve) => {
      setTimeout(() => {
        console.log('task2 -> 2s')
        resolve()
      }, 2000);
    })
  })
  .then(() => {
    setTimeout(() => {
      console.log('task3 -> 1s')
    }, 1000);
  })
})()

就可以了
而如果将第二个then 改成再返回一个promise就会没问题,请问这是为什么,我的想法是,第一种用Promise.then()不也是等待这个异步函数执行完再执行下面的内容吗?

请指教哪里理解的不对,谢谢了~


慕森卡
浏览 381回答 2
2回答

千巷猫影

为什么:then 接收的函数是会被判断的,如果这个函数是 promise,那么下一个 then 会变成传入的这个 promise 的 then,如果这个函数不是 promise,那么下一个 then 还是最开始的那个 promise 的 then
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript