Javascript 个异步事件

Javascript asynchronous events

我想了解回调,所以我创建了一个测试代码来检查异步行为。

function wait() {
while (new Date() < 2000 + new Date().getTime()){}
console.log("end");
}

console.log("start");
wait();

function clicke(){
console.log("click!")
}

document.addEventListener('click', clicke);

所以我希望在我执行它们时将日志放入 start 然后 clicks 并在 2 秒后 end。但问题是所有事件通知都出现在 startend 打印出来之后。 我做错了什么?

JavaScript是单线程的,while循环会阻塞线程。在 while 循环中忙等待两秒钟后,它会处理您正在创建的事件。要在两秒内记录消息,请执行以下操作:

setTimeout(function(){console.log("message")}, 2000);

https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout

异步意味着一个线程在另一个线程之外 运行ning。但是您的浏览器不是多线程的,它是单线程的。它将 运行 按照出现的顺序编码。在继续下一行之前,它将尝试完成您创建的 while loop。 GUI 也连接到该线程。在 while loop ergo 期间,您基本上是在阻止 GUI 页面变得无响应。

对 JavaScript 的添加是为了避免挂起主线程。 Ajax 调用是异步的,因为您不希望 xml 大的 5 mb 文件使浏览器在加载过程中无法使用。此外,原始的 setTimeoutsetInterval 允许异步操作。他们不会阻塞线程,但 运行 将它放在一边。

正在开发和实施新技术,例如 promises,它也允许异步调用,但您可以将函数链接到异步对象。

异步处理示例:

function start() {
  document.body.innerHTML += "<p>Started, you have ten seconds to click as much as you can.</p> ";
  var callback = function(){alert("Game Over")};
  document.addEventListener('click', clicke);  
  setTimeout('end('+callback+')', 10000); //send the callback to end the function end.
}

start();

var clicked = 0;
function clicke(){
 document.body.innerHTML += "<p>Clicked: "+ (clicked++) +"</p> "
}

function end(callback)
{
  document.body.innerHTML += "<p>Ended, you can no longer click.</p> ";
  document.removeEventListener('click', clicke);
  callback();
}