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

时间:2012-12-10 18:13:27

标签: javascript asynchronous

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

3 个答案:

答案 0 :(得分:30)

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

您可以使用环境提供的一些API(Node.js,Webbrowser),它们允许您安排异步任务 - 使用超时,ajax,FileAPI,requestAnimationFramenextTick,WebWorkers ,DOM事件,无论如何。

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

window.setTimeout(function() {
    console.log("World");
}, 1000);
console.log("Hello");

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

 Promise.resolve("World").then(console.log); // then callbacks are always asynchronous
 console.log("Hello");

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

答案 1 :(得分:8)

这是异步的:

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

console.log('2');

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

答案 2 :(得分:7)

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

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

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

for (var i = 0; i < 10; i++) {
  console.log(i);
}

但实际上只会打印10个!在 setTimeout循环完成后,将在{{1>}函数中调用函数(作为其'回调'参数)的原因 - 即,在for值之后设置为10。

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