Часто ли AsyncFunction работает асинхронно? - PullRequest
0 голосов
/ 07 февраля 2019

Я пишу модуль для загрузки и запускаю некоторые koa подобные промежуточные программы.Следующий фрагмент кода демонстрирует, как это работает.

function _createNext(it) {
  return async () => {
    const result = it.next()
    if (!result.done) {
      const middleware = result.value
      const next = _createNext(it)
      await middleware(next)
    }
  }
}

function _createMiddleware(x) {
  return async (next) => {
    console.log(`start: ${x}`)
    await next()
    console.log(`end: ${x}`)
  }
}

const arr = [
  _createMiddleware('a'),
  _createMiddleware('b'),
  _createMiddleware('c'),
]

const arrIterator = arr[Symbol.iterator]()
const next = _createNext(arrIterator)

console.log('1st Line')
next()  // <--- (*)
console.log('2nd Line')

Я ожидал, что «2-я строка» должна печататься сразу после «1-й строки», потому что я не await next() на строке(*) и next() должны быть асинхронными.Вместо этого мне кажется, что next() работает синхронно.

// ACTUAL result
1st Line
start: a
start: b
start: c
2nd Line
end: c
end: b
end: a

// EXPECTED result
1st Line
2nd Line
start: a
start: b
start: c
end: c
end: b
end: a

Затем я попытался обновить функцию _createNext следующим образом: все работает отлично.

function _createNext(it) {
  return () => {
    return Promise.resolve()
      .then(async () => {
        const result = it.next()
        if (!result.done) {
          const middleware = result.value
          const next = _createNext(it)
          await middleware(next)
        }
      })
  }
}

function _createMiddleware(x) {
  return async (next) => {
    console.log(`start: ${x}`)
    await next()
    console.log(`end: ${x}`)
  }
}

const arr = [
  _createMiddleware('a'),
  _createMiddleware('b'),
  _createMiddleware('c'),
]

const arrIterator = arr[Symbol.iterator]()
const next = _createNext(arrIterator)

console.log('1st Line')
next()  // <--- (*)
console.log('2nd Line')

Я не совсем понимаю, что не так с первым фрагментом кода.Я думал, что AsyncFunction ведет себя очень похоже на Обещание, в котором содержимое функции всегда должно запускаться в следующем тике.

Может ли кто-нибудь помочь объяснить?Большое спасибо.

...