Каково объяснение этого поведения: ES6 Обещание, которое никогда не решается - PullRequest
1 голос
/ 07 марта 2019

следующий код:

Promise.resolve('a string')
  .then(resp => {
    console.log('resp from the initial promise: ' + resp)
    const p0 = new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('finished sleeping in p0')
        resolve('hello from p0')
      }, 5000)
    })
    console.log('returning p0')
    return p0
  })
  .then(resp => {
    console.log('resp from p0: ' + resp)
    const p1 = new Promise((resolve, reject) => {
      console.log('p1 completed')
      // resolve('another string from p1')
    })
    console.log('returning p1')
    return p1
  })
  .then(res => {
    console.log('resp from p1: ' + res)
  })
  .catch(err => {
    console.error('Error: ' + err.message)
  })

console.log('last statement')

Когда я запускаю это, я получаю следующий вывод (это не имеет смысла для меня)

last statement
resp from the initial promise: a string
returning p0
finished sleeping in p0
resp from p0: hello from p0
p1 completed
returning p1

Прежде всего, поскольку обещание p1 никогда не выполняется, я ожидаю, что программа просто будет ждать вечно и никогда не закончится. Дело обстоит не так, и это заканчивается просто отлично (хотя и не доходя до последнего then()).

Кроме того, он создает обещание и выполняет код внутри обещания до кода, который появляется после его создания. Я ожидаю, что «возврат p1» наступит до того, как «p1 будет завершен», поскольку я предполагал, что то, что находится внутри обещания, будет выполнено на следующем тике.

1 Ответ

2 голосов
/ 08 марта 2019

Кроме того, он создает обещание и выполняет код внутри обещания перед кодом, который появляется после его создания.Я ожидаю, что «возврат p1» наступит раньше, чем «p1 будет завершен», так как я предполагал, что то, что находится внутри обещания, будет выполнено на следующем тике.

Если вы позвоните .then по обещанию,Передаваемая вами функция будет отложена до следующего тика.Но конструктор обещания ведет себя не так.Когда вы создаете new Promise, код, который вы передаете в конструктор, запускается немедленно и синхронно.Таким образом, этот код:

const p0 = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('finished sleeping in p0')
    resolve('hello from p0')
  }, 5000)
})
console.log('returning p0')

... немедленно установит тайм-аут, прежде чем обещание будет даже присвоено p0.И этот код:

const p1 = new Promise((resolve, reject) => {
  console.log('p1 completed')
  // resolve('another string from p1')
})
console.log('returning p1')

... немедленно выйдет из системы «p1 выполнено», прежде чем обещание будет даже присвоено p1.

...