什么是异步javascript函数的简单示例?

Jas*_*lsa 18 javascript asynchronous

我真的在努力学习编写异步JavaScript.能否请您提供一个简单的JavaScript函数示例,它是用纯JavaScript编写的异步(而不是使用Node.js或JQuery)

Ber*_*rgi 30

JavaScript本身是同步和单线程的.你不能写一个异步函数; plain JS没有计时API.并行线程没有副作用.

你可以做的是使用你的环境(Node.js的,的Webbrowser),允许您安排异步任务提供了一些API -使用超时,AJAX功能,FileAPI, requestAnimationFrame,nextTick,WebWorkers,DOM事件,等等.

使用示例setTimeout(由HTML Timing API提供):

window.setTimeout(function() {
    console.log("World");
}, 1000);
console.log("Hello");
Run Code Online (Sandbox Code Playgroud)

更新:自ES6以来,承诺作为内置于纯JavaScript的异步原语,所以你可以做到

 Promise.resolve("World").then(console.log); // then callbacks are always asynchronous
 console.log("Hello");
Run Code Online (Sandbox Code Playgroud)

然而,当你没有什么可以等待的时候(例如超时),他们自己并没有真正的帮助.并且它们也没有改变任何关于线程模型的信息,所有执行都是在没有任何事件中途干扰的情况下运行完成.

  • 我认为 async 与时间无关,而更多地是将一个函数或一组函数作为一种后台任务运行,以便 JavaScript 解释器无需等待运行下一个函数。或者换句话说,并行而不是串行运行函数。真的吗? (2认同)
  • @jasdeepkhalsa:不,javascript本身并不是并行运行 - 它始终是单线程的(WebWorkers是解决方法).后台发生的是等待,文件访问,HTTP请求等. (2认同)

Pet*_*sen 9

这是异步的:

setTimeout(function(){
   console.log('1');
}, 2000);

console.log('2');
Run Code Online (Sandbox Code Playgroud)

2将在1之前写入控制台.因为setTimeout是异步的.


rai*_*7ow 7

这是一个非常简单的例子:

for (var i = 0; i < 10; i++) {
  window.setTimeout(function() {
    console.log(i);
  }, 2000);
}
Run Code Online (Sandbox Code Playgroud)

您可能希望这些console.log()调用显示给您0, 1, 2,就像在此片段中一样:

for (var i = 0; i < 10; i++) {
  console.log(i);
}
Run Code Online (Sandbox Code Playgroud)

但事实上只会10打印出来的!函数传递给setTimeout函数的原因(作为其'callback'参数)将 for循环完成调用- 即,在ivalue设置为10之后.

但是你应该理解一件事:浏览器中的所有JavaScript都在一个线程上执行; 异步事件(例如鼠标单击和计时器)仅在执行队列中打开时运行.这是John Resig撰写的关于这个主题的精彩文章.

  • 循环的问题是一个范围问题,而不是因为它的异步性质.如果它们的范围正确,则循环将按预期工作.虽然它是传递给`setTimout`的函数的一个很好的解释,执行_after_ the`for`循环 (5认同)