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)
然而,当你没有什么可以等待的时候(例如超时),他们自己并没有真正的帮助.并且它们也没有改变任何关于线程模型的信息,所有执行都是在没有任何事件中途干扰的情况下运行完成.
这是异步的:
setTimeout(function(){
console.log('1');
}, 2000);
console.log('2');
Run Code Online (Sandbox Code Playgroud)
2将在1之前写入控制台.因为setTimeout是异步的.
这是一个非常简单的例子:
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撰写的关于这个主题的精彩文章.
| 归档时间: |
|
| 查看次数: |
26252 次 |
| 最近记录: |