Я пишу модуль для загрузки и запускаю некоторые 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 ведет себя очень похоже на Обещание, в котором содержимое функции всегда должно запускаться в следующем тике.
Может ли кто-нибудь помочь объяснить?Большое спасибо.