Javascript await / async - вызовет ли это состояние гонки? - PullRequest
0 голосов
/ 03 января 2019

Скажем, у меня есть сервер nodeJS, который использует Socket.IO.Один слушатель асинхронный, например так:

let aHugeArray = new Array(50000000);
// ... fill the array with data...

// print the array asynchronously:
socket.on('print-array', async () => {
    let isFinished = await printArray();
});

// remove an item from the array:
socket.on('remove-from-array', (item : any) => {
    let index = aHugeArray.indexOf(item);
    aHugeArray.splice(index, 1);
});

private async printArray() : Promise<boolean> {
    for (let i = 0; i < aHugeArray.length; i++) {
        console.log(aHugeArray[i]);
    }
    return true;
}

Предположим, я вызываю print-array, а затем немедленно вызываю remove-from-array (который будет выполнен до того, как print-array завершит цикл по массиву. Что произойдет в этой ситуации? Будет ли обратный вызов remove-from-array заблокирован от манипулирования aHugeArray до завершения цикла? Или будет работать с массивом, что может привести к странным результатам в остальных итерациях цикла print-array?

1 Ответ

0 голосов
/ 03 января 2019

Функция print-array не является асинхронной, поэтому, если у вас нет одного адского большого количества памяти, захват ее содержимого и запись в нее не приведет к заметному блокированию потока в ожидании запуска remove-from-array

Если у вас есть функция, которую нужно завершить до того, как что-то закончится, то пообещайте ее

const IMightTakeSomeTime = new Promise ((resolve, fail) => {
    setTimeout(() => {
        resolve(console.log('i am finished'))
    }, 3000);
})

IMightTakeSomeTime.then(() => 
    console.log('Now its my time to shine')
)

или вы можете использовать async / await, если хотите получить фантазию

const IMightTakeSomeTime = new Promise ((resolve, fail) => {
    setTimeout(() => {
        resolve(console.log('i am finished'))
    }, 3000);
})

const run = async () => {
    await IMightTakeSomeTime
    console.log('Now its my time to shine')
}

run()

Если вы хотите увидеть хорошо известные не асинхронные функции блокировки потоков в действии, ознакомьтесь с синхронной версией библиотеки Node.js fs, где есть «синхронизирующие» версии некоторых функций, которые не нужно ожидать

https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options

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