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

IT技术 javascript asynchronous
2021-03-18 08:17:12

我在这里真的很努力来掌握编写异步 JavaScript。你能否提供一个简单的 JavaScript 函数的例子,它是用纯 JavaScript 异步编写的(而不是使用 Node.js 或 JQuery)

3个回答

JavaScript 本身是同步的和单线程的。您不能编写异步函数;纯 JS 没有计时 API。并行线程不会有副作用。

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

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

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

更新:由于 ES6 有Promise作为内置于纯 JavaScript 中的异步原语,所以你可以这样做

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

但是,就其本身而言,当您无法等待(例如超时)时,它们并没有真正的帮助。而且它们也不会改变线程模型的任何内容,所有执行都是从运行到完成的,中途没有任何事件干扰。

@jasdeepkhalsa:不,javascript 本身不是并行运行的——它总是单线程的(WebWorkers 是解决方法)。后台发生的是等待、文件访问、HTTP 请求等。
2021-04-19 08:17:12
@zerkms:我想答案需要更新,是的
2021-04-24 08:17:12
我认为 async 与时间无关,而更多地是将一个函数或一组函数作为一种后台任务运行,以便 JavaScript 解释器无需等待运行下一个函数。或者换句话说,并行而不是串行运行函数。真的吗?
2021-05-04 08:17:12
+1,非常真实;“异步”任务只是在执行队列中移动的任务。因此(有时)有用的技巧与setTimeout(func, 0). )
2021-05-07 08:17:12
你好 2016 年:“JavaScript 本身是同步的”——Promises在标准中添加后,这是否仍然保留
2021-05-13 08:17:12

这是异步的:

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

console.log('2');

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

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

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打印 s!函数传入setTimeout函数的原因(作为它的“回调”参数)将 for循环完成后被调用- 即在ivalue 设置为 10 之后。

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

循环的问题是范围问题,而不是因为它的异步性质。如果它们的范围正确,循环将按预期工作。虽然它很好地解释循环传递给setTimout执行的函数for
2021-05-09 08:17:12