все может быть асинхронным в JavaScript? - PullRequest
0 голосов
/ 21 сентября 2019

Я углубляюсь в javascript, и недавно я решил понять асинхронность в javascript.Итак, я изучил около десяти часов и прочитал около 20 статей о стеке вызовов, обратных вызовах, обещаниях, асинхронности / ожидании, цикле событий и даже движке V8.

Теперь я знаю, что js является однопоточным, синхронным и не-блокирование языка и использование цикла событий, таблицы событий и очереди сообщений для обработки асинхронного поведения.

ОК!здорово!но, наконец, я не понимаю, что может быть асинхронным?

каждый Автор использует setTimeout, запрос к DB, AJAX и модуль fs в качестве примера для объяснения асинхронности.но мы знаем, что все они API, и они не являются частью ядра JavaScript.

Итак, можем ли мы выполнить цикл for, который вычисляет сумму в 1 миллиард чисел асинхронно?если да, то как, а если нет, то почему?Могу ли я сказать, асинхронное поведение только для веб-API или C ++ API или т. д.?

Ответы [ 2 ]

2 голосов
/ 21 сентября 2019

Обратите внимание, что на моем довольно высокомощном ПК это займет 4 секунды, чтобы набрать 1000 значений!не очень быстро - вам бы хотелось, скажем, порциями по 1 000 000 значений - 100 000 000 значений займет около 2 секунд ... 1 000 000 000 значений невозможно, я получаю ошибку нехватки памяти при попытке создать такой массив: p

Вы можете сделать это несколькими способами

Вот два разных способа - ни один не является более производительным, чем другой

Использование setTimeout и обратного вызова

function asyncSum(array, cb) {
    let result = 0;
    const fn = n => {
        result += array[n];
        if (n < array.length - 1) {
            setTimeout(fn, 0, n+1);
        } else {
            cb(result);
        }
    };
    fn(0);
}


asyncSum([1,2,3,4], console.log);

Использование setTimeout и Promise

function asyncSumPromise(array) {
    return new Promise(resolve => {
        let result = 0;
        const fn = n => {
            result += array[n];
            if (n < array.length - 1) {
                setTimeout(fn, 0, n+1);
            } else {
                resolve(result);
            }
        }
        fn(0);
    });
}
asyncSumPromise([1,2,3,4]).then(console.log);
0 голосов
/ 21 сентября 2019

Любая функция может быть асинхронной, примеры, которые вы перечислили, заключаются в том, что асинхронность обычно используется, когда вы ожидаете ответа от сервера, и вы не блокируете или не можете заблокировать свою программу для ожидания ответа.Вы можете использовать Promise, но вы говорили о setTimeout, чтобы считать до миллиарда.Это рекурсивная функция.А вот setTimeout для подсчета до миллиарда.Наслаждайтесь ожиданием.

    let counter = 0;
function counting(){
    setTimeout(function(){
    if(counter < 1000000000){counter = counter + 1; counting();} }, 500);
}
counting();

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

...