我真的在努力学习编写异步JavaScript。能否请您提供一个简单的JavaScript函数示例,它是用纯JavaScript编写的异步(而不是使用Node.js或JQuery)
答案 0 :(得分:30)
JavaScript本身是同步和单线程的。你不能写一个异步函数; plain JS没有计时API。并行线程没有副作用。
您可以使用环境提供的一些API(Node.js,Webbrowser),它们允许您安排异步任务 - 使用超时,ajax,FileAPI,requestAnimationFrame
,nextTick
,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。