假设我有以下代码
var x = 5;
for (var i = 0; i < 1000; i++) {
x = x + i;
}
launch(x);
function launch(x) {
console.log(x);
}
javascript的异步性质是否意味着在launch
周期结束之前可以调用函数for
?或者只有在x
上的操作结束后才会调用它?如何确保后者?
更新:我在Node.Js应用
中使用它答案 0 :(得分:2)
否即可。只有在for
周期异步运行时才会出现这种情况。
循环退出后,将始终生成函数launch
。不同之处可能在于你有类似
for (var i = 0; i < 1000; i++) {
somethingAsync(i);
}
launch(x);
循环仍然会先完成,但somethingAsync(i)
可能不会,因为它是异步运行的。循环始终同步运行,只有循环内容可能异步运行。您必须知道您正在调用的函数是同步/异步。
如果循环体是异步的,那么在循环中的所有内容返回后,您必须做更多的工作来运行函数launch(x)
。这个概念叫做 promises ,它基本上允许你说出像这里的异步操作列表,在所有这些操作完成后运行另一件事。
以下是有关承诺的一些参考资料
更新:以上提到的Node.js和浏览器都是如此。在这两种情况下,JavaScript作为语言的语义是相同的。
答案 1 :(得分:0)
在您实际调用setTimeout
之类的异步构造或异步HTTP请求之前,JavaScript是完全同步且确定的。该代码将按顺序执行。
答案 2 :(得分:0)
此代码将同步运行,因为没有异步调用(如$ .get,$ .ajax和jquery中的一些东西)