我很好奇所有 javascript 回调是否都是异步的,或者是否仅在某些情况下是这种情况。另外,我确定是什么使 javascript 代码异步(或使用异步 javascript 的方法)在浏览器和 nodejs 之间有所不同,所以我想知道在每种情况下什么构成真正的异步 javascript。
我的印象是,在以下场景中,我实际上并不是在编写异步代码。
function addOne(value){
value = value + 1;
return value;
}
function simpleMap(values, callback){
for(i = 0; i < values.length; i++){
val = values[i];
val = callback(val);
values[i] = val;
}
return values;
}
newValues = simpleMap([1,2,3], addOne);
但是,例如,我知道 jQuery 的 AJAX 函数是真正异步的(不考虑现在可用的Promise)。是什么让 jQuery 的 AJAX 异步?是不是就这么简单,涉及到XHR请求,在浏览器中,所有XHR请求都是异步的?
我对 nodejs 环境有同样的问题。如果 node 中的某些东西涉及文件 i/o、process.nextTick、setTimeout 或 setInterval 之类的东西,它是否只能是异步的?为什么当我使用 mongodb/mongoose 执行数据库调用之类的操作时,这是异步的吗?幕后到底发生了什么事情才如此?
异步“情况”是否由环境预先确定?或者有什么方法可以让自己的功能真正异步而不利用环境的非常具体的功能(例如xhr,节点中的文件io,process.nexttick等)?