我很好奇是否所有 javascript 回调都是异步的,或者是否仅在某些情况下是这种情况。另外,我确定是什么让浏览器和 nodejs 之间的 javascript 代码异步(或使用异步 javascript 的方式)不同,所以我想知道在每种情况下什么构成真正的异步 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 函数是真正异步的(不考虑现在可用的承诺)。是什么让 jQuery 的 AJAX 异步?是不是就这么简单,涉及到XHR请求,而在浏览器中,所有的XHR请求都是异步的?
我对 nodejs 环境有同样的问题。如果节点中的某些内容涉及文件 i/o、process.nextTick、setTimeout 或 setInterval 之类的内容,它是否只能是异步的?为什么当我使用 mongodb/mongoose 执行数据库调用之类的操作时,这是异步的吗?幕后发生的事情是什么?
异步“情况”是由环境预先确定的吗?或者有什么方法可以让自己的功能真正异步,而无需利用环境的非常具体的功能(例如 xhr、节点中的文件 io、process.nexttick 等)?