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);
我正在深入 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);