javascript 中的一切都可以异步吗?

can everything be async in javascript?

我正在深入 javascript,最近我决定在 javascript 中理解异步。所以我研究了大约十个小时,阅读了大约 20 篇关于调用堆栈、回调、承诺、async/await、事件循环甚至 V8 引擎的文章。

现在,我知道 js 是一种单线程、同步和非阻塞的语言,并使用事件循环、事件 table 和消息队列来处理异步行为。

好的!伟大的!但最后我不明白什么东西可以异步?

每位作者都以setTimeout、query to DB、AJAX和fs模块为例来讲解async。但我们知道它们都是 api 并且它们不是 javascript 核心的一部分。

那么,我们可以执行一个for循环来异步计算10亿个数字的总和吗?如果是,怎么做,如果不是,为什么?我可以说异步行为仅适用于 web api 或 c++ api 等吗?

任何函数都可以是异步的,你列出的例子是因为异步通常在你等待服务器响应时使用,而你不会或不能阻止你的程序等待响应。您可以使用 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

Please note, on my fairly high spec PC, this takes 4 seconds to do 1000 values! not very fast - you'd want to do say, chunks of 1,000,000 values - 100,000,000 values will take about 2 seconds ... 1,000,000,000 values is not possible, I get an out of memory error when trying to create such an array :p

您可以通过多种方式做到这一点

这里有 2 种不同的方式 - 没有一种比另一种更高效

使用 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);