Var имеет то же значение после использования await в функции, выполняемой с помощью Promise.all - PullRequest
0 голосов
/ 02 ноября 2019

В функции run1 случайное значение генерируется и сохраняется в random_var, await используется для задержки, а затем random_value разрешается.

При асинхронном запуске run1 с использованием Promise.all random_var равно изменено при регистрации после оператора await, как показано в демонстрационном фрагменте кода

main()

async function main() {
    await Promise.all([run1(), run1(), run1()]).then(value => {
        console.log({ values: value })
    })
}

async function run1() {
    return new Promise(async (resolve, reject) => {
        random_var = makeid(6)
        console.log('Logging 1st time has different values', random_var)
        await new Promise(resolve => setTimeout(resolve, 500))
        console.log('Logging 2nd time has same values', random_var)
        resolve(random_var)
    })
}


function makeid(length) {
    var result = '';
    var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    var charactersLength = characters.length;
    for (var i = 0; i < length; i++) {
        result += characters.charAt(Math.floor(Math.random() * charactersLength));
    }
    return result;
}

1 Ответ

1 голос
/ 02 ноября 2019

Это связано с подъемом и областью применения. Ваша строка random_var = makeid(6) не использует let или const, поэтому она переносится в глобальную область, где она не изменится после разрешения обещаний. изменение его на const random_var = makeid(6) (или let или var, но наилучшая практика здесь постоянна, потому что вы никогда не будете изменять его), должно решить проблему.

main()

async function main() {
    await Promise.all([run1(), run1(), run1()]).then(value => {
        console.log({ values: value })
    })
}

async function run1() {
    return new Promise(async (resolve, reject) => {
        const random_var = makeid(6)
        console.log('Logging 1st time has different values', random_var)
        await new Promise(resolve => setTimeout(resolve, 500))
        console.log('Logging 2nd time has same values', random_var)
        resolve(random_var)
    })
}


function makeid(length) {
    var result = '';
    var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    var charactersLength = characters.length;
    for (var i = 0; i < length; i++) {
        result += characters.charAt(Math.floor(Math.random() * charactersLength));
    }
    return result;
}
...