Javascript: Имеет ли значение, где переменные 'let' инициализируются внутри блока? - PullRequest
0 голосов
/ 26 февраля 2020

Следующее поведение Javascript является для меня полной загадкой. Следующий фрагмент кода не работает:

let someFunctionOne = async () => (new Promise(resolve => setTimeout(resolve(1), 1000)))
let someFunctionTwo = async () => (new Promise(resolve => setTimeout(resolve(2), 1000)))
let someFunctionThree = async () => (new Promise(resolve => setTimeout(resolve(3), 1000)))

let myFunction = async () => {
    let resultOne
    if (true) {
        let resultTwo, resultThree // <-- doesn't work
        if (false) {
            throw new Error('Something went wrong')
        }

        const promiseOne = someFunctionOne()
        const promiseTwo = someFunctionTwo()
        const promiseThree = someFunctionThree()

        [resultOne, resultTwo, resultThree] = await Promise.all([
            promiseOne,
            promiseTwo,
            promiseThree]
        )
    resultOne = {resultOne, resultTwo, resultThree}
    }
    return resultOne
}
let result = await myFunction()
console.log(result)

Это приводит к следующей ошибке:

ReferenceError: Cannot access 'promiseThree' before initialization

Однако, когда инициализация двух переменных находится прямо над Promise.all ( ) назовите это работает:

    let someFunctionOne = async () => (new Promise(resolve => setTimeout(resolve(1), 1000)))
let someFunctionTwo = async () => (new Promise(resolve => setTimeout(resolve(2), 1000)))
let someFunctionThree = async () => (new Promise(resolve => setTimeout(resolve(3), 1000)))

let myFunction = async () => {
    let resultOne
    if (true) {
        if (false) {
            throw new Error('Something went wrong')
        }

        const promiseOne = someFunctionOne()
        const promiseTwo = someFunctionTwo()
        const promiseThree = someFunctionThree()

        let resultTwo, resultThree // <-- does work

        [resultOne, resultTwo, resultThree] = await Promise.all([
            promiseOne,
            promiseTwo,
            promiseThree]
        )
    resultOne = {resultOne, resultTwo, resultThree}
    }
    return resultOne
}
let result = await myFunction()
console.log(result)

Почему второй фрагмент кода работает, а первый нет? Для обеих переменных инициализация переменных resultTwo и resultThree происходит до того, как они используются ...

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...