asynchronous如何处理Javascript中的variables?
假设我有以下代码
var x = 5; for (var i = 0; i < 1000; i++) { x = x + i; } launch(x); function launch(x) { console.log(x); }
javascript的asynchronous性质是否意味着可能会在for
循环结束之前调用函数launch
? 还是只有在x
的操作结束后才会调用? 如何确保后者?
更新:我在一个Node.Js应用程序中使用它
没有 。 这只有在for
循环会asynchronous运行时才是正确的。
循环退出后, launch
function将始终生效。 如果你有类似的东西,可能会有所不同
for (var i = 0; i < 1000; i++) { somethingAsync(i); } launch(x);
循环仍然会先完成,但somethingAsync(i)
可能不会,因为它是asynchronous运行的。 循环总是同步运行,只有循环的内容可能asynchronous运行。 你必须知道你所调用的函数是同步/asynchronous的。
如果循环体是asynchronous的,那么在循环中的所有内容都返回之后,你需要做更多的工作才能运行launch(x)
函数。 这个概念被称为承诺 ,基本上允许你说这里有一个asynchronous操作列表的东西,所有这些操作完成后运行这个其他的东西 。
以下是有关承诺的一些参考资料
- http://www.html5rocks.com/en/tutorials/es6/promises/
- https://developer.mozilla.org/cs/docs/Web/JavaScript/Reference/Global_Objects/Promise
- https://www.promisejs.org/
更新:上面提到的Node.js和浏览器都是如此。 JavaScript作为语言的语义在两种情况下都是相同的。
JavaScript是完全同步和确定性的,直到你实际调用一个asynchronous构造,如setTimeout
或者一个asynchronousHTTP请求。 该代码将按顺序执行。
此代码将同步运行,因为没有asynchronous调用(如$ .get,$ .ajax和jquery中的一些东西)