什么是 JavaScript 里的异步操作和回调函数

简介: JavaScript 宿主环境提供了许多功能,允许开发人员安排异步操作。 换句话说,我们可以立即触发一个动作,但这些动作需要耗费一定的时间才能完成执行。

JavaScript 宿主环境提供了许多功能,允许开发人员安排异步操作。 换句话说,我们可以立即触发一个动作,但这些动作需要耗费一定的时间才能完成执行。


setTimeout 函数就是一个典型的例子。


看看函数 loadScript(src),它使用给定的 src 加载脚本:


function loadScript(src) {
  // creates a <script> tag and append it to the page
  // this causes the script with given src to start loading and run when complete
  let script = document.createElement('script');
  script.src = src;
  document.head.append(script);
}


上述代码创建一个 <script> 标记并将其附加到页面。 这会导致具有给定 src 的脚本开始加载并在完成时运行。


消费方式也很简单:


// load and execute the script at the given path
loadScript('/my/script.js');


该脚本是 异步执行的,因为它现在开始加载,但实际脚本的运行逻辑,绝大多数时候发生在函数 loadScript 已经完成时。


如果 loadScript(…) 下面有任何代码,这些代码会立即执行,而不会等待脚本加载完成再执行。


假设我们需要在新脚本加载后立即使用它。 它声明了新函数 newFunction,我们想要运行这个函数。


但是如果我们在 loadScript(…) 调用之后立即调用 newFunction,那就行不通了:


loadScript('/my/script.js'); // the script has "function newFunction() {…}"
newFunction(); // no such function!

上面的代码根本不能正常工作。


自然,浏览器可能没有时间加载脚本。 到目前为止, loadScript 函数还没有提供跟踪加载完成的方法。 脚本加载并最终运行,仅此而已。 但我们想知道它何时发生,使用该脚本中的新函数和变量。


让我们添加一个回调函数作为 loadScript 的第二个参数,它应该在脚本加载时执行:


function loadScript(src, callback) {
  let script = document.createElement('script');
  script.src = src;
  script.onload = () => callback(script);
  document.head.append(script);
}


onload 事件用于在脚本加载执行后执行一个函数。


现在,如果我们想从脚本中调用新函数,我们应该在回调中写下:


loadScript('/my/script.js', function() {
  // the callback runs after the script is loaded
  newFunction(); // so now it works
  ...
});


一个实际消费 loadScript 的例子:


function loadScript(src, callback) {
  let script = document.createElement('script');
  script.src = src;
  script.onload = () => callback(script);
  document.head.append(script);
}
loadScript('https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.2.0/lodash.js', script => {
  alert(`Cool, the script ${script.src} is loaded`);
  alert( _ ); // _ is a function declared in the loaded script
});


相关文章
|
2月前
|
前端开发 JavaScript
如何处理 JavaScript 中的异步操作和 Promise?
如何处理 JavaScript 中的异步操作和 Promise?
15 1
|
2月前
|
前端开发 JavaScript 数据处理
在JavaScript中,什么是异步函数执行的例子
在JavaScript中,什么是异步函数执行的例子
10 0
|
3天前
|
JavaScript 大数据 开发者
Node.js的异步I/O模型与事件循环:深度解析
【4月更文挑战第29天】本文深入解析Node.js的异步I/O模型和事件循环机制。Node.js采用单线程与异步I/O,遇到I/O操作时立即返回并继续执行,结果存入回调函数队列。事件循环不断检查并处理I/O事件,通过回调函数通知结果,实现非阻塞和高并发。这种事件驱动编程模型简化了编程,使开发者更专注业务逻辑,为高并发场景提供高效解决方案。
|
20天前
|
Web App开发 缓存 JavaScript
|
1月前
|
JavaScript 前端开发
JS 单线程还是多线程,如何显示异步操作
JS 单线程还是多线程,如何显示异步操作
22 2
|
2月前
|
JavaScript
JS回调函数
JS回调函数
9 0
|
2月前
|
存储 JavaScript 前端开发
js开发:请解释什么是回调函数(callback function),并给出一个示例。
回调函数是JavaScript中处理异步编程的一种常见模式,常用于事件驱动和I/O操作。它们作为参数传递给其他函数,在特定条件满足或任务完成后被调用。例如,`asyncOperation`函数接受回调函数`handleResult`,在模拟的异步操作完成后,调用`handleResult`并传递结果。这使得程序员能在操作完成后执行后续任务。
22 1
|
2月前
|
JavaScript 前端开发 Java
Java Script中的回调函数,可以用来做什么
Java Script中的回调函数,可以用来做什么
10 0
|
2月前
|
JavaScript 前端开发 UED
解释 JavaScript 中的异步编程和回调函数。
解释 JavaScript 中的异步编程和回调函数。
17 0
|
11月前
|
前端开发 JavaScript
web前端面试高频考点——JavaScript 篇(二)【JS 异步进阶】Event Loop、then 和 catch、async/await、宏任务微任务、手撕 Promise 源码
web前端面试高频考点——JavaScript 篇(二)【JS 异步进阶】Event Loop、then 和 catch、async/await、宏任务微任务、手撕 Promise 源码
145 0