函数如何知道某事是回调;某些先前的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 event loop的工作原理
请注意,由于您使用了require
,所以我假设使用Node.js环境,但是我所说的大部分内容也适用于浏览器:有一串异步函数,最后一个将调用其中一个内置函数。 -in功能(例如XMLHttpRequest
)。浏览器环境也使用事件循环,async/await
的工作方式相同