函数如何知道某些东西是回调;一旦某些先前的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);
"require"函数的结构是什么样的,以便它知道参数 2(在本例中为 handleResponse(应在请求完成后执行?我想这归结为我上面问的同一个问题。
即使函数中没有 async 关键字,函数也可以异步吗?如果是,浏览器如何知道它是一个异步函数?
-
我假设你的意思是询问
request
函数。大多数异步函数调用其他异步函数来完成一些工作,然后调用回调。您可以将其视为函数和回调链。这就是request
函数的作用。当然,至少最后一个函数需要真正异步,通常这是一个由节点内置模块(fs
、http
、...(导出的函数。它也可以由本机模块导出,或者在较新的节点版本中使用worker_threads
模块。 -
async
关键字不是函数异步所必需的。将函数标记为async
允许函数使用await
语法,并使函数隐式返回 Promise。
为了更好地理解异步代码的工作原理,您应该看看节点事件循环的工作原理
请注意,我假设了一个 Node.js 环境,因为您使用了require
,但我所说的大部分内容也适用于浏览器:有一个异步函数链,最后一个将调用内置函数之一(例如XMLHttpRequest
(。浏览器环境也使用事件循环,async/await
以相同的方式工作