回调是如何在幕后用Javascript编码的?



函数如何知道某些东西是回调;一旦某些先前的I/O完成就需要执行的东西。它怎么知道它不应该立即执行?它是否以(标准化(方式在函数中定义?

据我所知,参数中经常使用的"callback"关键字只是常见的做法,但不会自动让函数将参数解释为在某些I/O完成后应该启动的东西。

以下面的例子为例,我有两个问题(取自 https://medium.com/codebuddies/getting-to-know-asynchronous-javascript-callbacks-promises-and-async-await-17e0673281ee(:

const request = require(‘request’);
function handleResponse(error, response, body){
if(error){
// Handle error.
}
else {
// Successful, do something with the result.
}
}
request('https://www.somepage.com', handleResponse);
  1. "require"函数的结构是什么样的,以便它知道参数 2(在本例中为 handleResponse(应在请求完成后执行?我想这归结为我上面问的同一个问题。

  2. 即使函数中没有 async 关键字,函数也可以异步吗?如果是,浏览器如何知道它是一个异步函数?

  1. 我假设你的意思是询问request函数。大多数异步函数调用其他异步函数来完成一些工作,然后调用回调。您可以将其视为函数和回调链。这就是request函数的作用。当然,至少最后一个函数需要真正异步,通常这是一个由节点内置模块(fshttp、...(导出的函数。它也可以由本机模块导出,或者在较新的节点版本中使用worker_threads模块。

  2. async关键字不是函数异步所必需的。将函数标记为async允许函数使用await语法,并使函数隐式返回 Promise。

为了更好地理解异步代码的工作原理,您应该看看节点事件循环的工作原理

请注意,我假设了一个 Node.js 环境,因为您使用了require,但我所说的大部分内容也适用于浏览器:有一个异步函数链,最后一个将调用内置函数之一(例如XMLHttpRequest(。浏览器环境也使用事件循环,async/await以相同的方式工作

最新更新