我正在考虑用node.js制作某些东西,和其他学习node的人一样,我对它的异步性质有疑问。我搜索了一下,但没有找到关于这个问题的具体答案(也许是我没搜索好...),所以我问一下:
如果文档说明node.js回调函数是异步的,那么它们是否保证异步?如果您自己编写带有回调的函数,应该设计成始终异步或始终同步吗?还是它们有时可以是同步的,有时不是?
举个例子,假设你想要从互联网上加载一些数据,并创建一个加载数据的函数。但是数据很少更改,所以你决定将其缓存以供将来调用。你可以想象有人会像这样编写该函数:
function getData(callback) {
if(dataIsCached) {
callback(cachedData)
} else {
fetchDataFromNetwork(function (fetchedData) {
dataIsCached = true;
cachedData = fetchedData;
callback(fetchedData);
});
}
}
fetchDataFromNetwork是一个执行其回调函数的异步函数(这有点伪代码,但我希望你能理解我的意思)。
如果数据已被缓存,该函数仅会直接执行回调而不会异步触发。在这种情况下,函数的异步性质实际上是完全不必要的。
这种做法是否不被鼓励?应该将函数的第二行改为setTimeout(function () {callback(cachedData)}), 0)
,以确保它异步触发吗?
我之所以问这个问题,是因为我曾经看到过一些代码,其中回调函数内的代码仅仅假定回调函数外的函数已经执行完毕。我对此感到有些反感,想着“但你怎么知道回调函数一定会异步触发呢?如果它不需要异步触发并同步执行了怎么办?你为什么要假设每个回调都保证是异步的呢?”
如果您能就此问题进行澄清,我将不胜感激。谢谢!