我有一个关于Array.forEachJavaScript 的本机实现的问题:它是否异步?例如,如果我打电话:
[many many elements].forEach(function () {lots of work to do})
Run Code Online (Sandbox Code Playgroud)
这会不会阻塞吗?
我很好奇所有的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);
Run Code Online (Sandbox Code Playgroud)
但是,例如,我知道jQuery的AJAX函数是真正异步的(不考虑现在可用的承诺).是什么让jQuery的AJAX异步?是否涉及XHR请求这么简单,在浏览器中,所有XHR请求都是异步的?
我对nodejs环境有同样的问题.节点中的某些东西只有在涉及文件i/o,process.nextTick,setTimeout或setInterval之类的东西时才能是异步的吗?为什么当我使用mongodb/mongoose进行数据库调用时,是异步的?幕后发生了怎样的事情呢?
异步"情况"是否由环境预先确定?或者是否有某种方法可以使自己的函数真正异步而不利用环境的非常特定的函数(例如xhr,节点中的文件io,process.nexttick等)?
我有点困惑,不是关于使用什么回调,而是因为我看到在场景中使用的回调通常似乎将函数作为参数传递给另一个函数是没有必要的,因为你可以只调用你想调用的函数在当前函数中的代码完成执行之后.例如:
function hello( a , b ) {
var result = a + b;
myFunction();
}
myFunction() {
//code
}
hello(1,2);
Run Code Online (Sandbox Code Playgroud)
令人困惑的是,我已经看到很多例子,在一个场景中使用回调就像我写的第一个代码一样简单,在我看来根本不需要回调:
function hello(a, b, callback) {
var result = a + b;
callback();
}
myFunction() {
//code
}
hello(1, 2, myFunction);
Run Code Online (Sandbox Code Playgroud)
我在那里使用了回调但是我可以myFunction在代码执行后调用函数而不myFunction作为参数传递.我理解一个框架或库不知道代码完成执行后你想要调用的函数的名称,所以传递你想要的函数稍后作为参数传递似乎有意义然后当你知道函数的名称你希望在函数中执行任何代码后调用,为什么不像我在第一个例子中那样调用它?我很感激你的帮助.谢谢