【发布时间】:2015-11-03 20:35:18
【问题描述】:
我正在尝试在 node.js 中制作一些东西,而且我(和其他所有开始学习 node 的人一样)对它的异步性质有疑问。我搜索了一下,但找不到关于它的这个特定问题的答案(也许我只是没有很好地搜索......),所以这里是:
node.js 回调,一般来说,保证如果文档这么说是异步的吗?如果您制作自己的回调函数,您是否应该以这样的方式进行设计,以使它们始终异步或始终同步?或者它们有时是同步的,有时不是同步的?
例如,假设您想通过 Internet 加载一些数据,并且您创建了一个函数来加载它。但是数据不会经常更改,因此您决定将其缓存以备将来调用。你可以想象有人会这样写这个函数:
function getData(callback) {
if(dataIsCached) {
callback(cachedData)
} else {
fetchDataFromNetwork(function (fetchedData) {
dataIsCached = true;
cachedData = fetchedData;
callback(fetchedData);
});
}
}
其中 fetchDataFromNetwork 是一个异步执行其回调的函数(这有点伪代码,但我希望你明白我的意思)。
这个函数只会在数据没有被缓存的情况下异步触发,如果数据被缓存了它就直接执行回调。在这种情况下,函数的异步特性毕竟是完全没有必要的。
这种事情不鼓励吗?函数的第二行是否应该改为setTimeout(function () {callback(cachedData)}), 0),以保证它异步触发?
我问的原因是我不久前看到了一些代码,其中回调内部的代码只是假设回调外部的函数的其余部分在回调内部的代码之前执行。我对此有点退缩,想“但是你怎么知道回调将异步触发?如果它不需要并且同步执行怎么办?为什么你会假设每个回调都是有保证的?是异步的?”
任何关于这一点的澄清将不胜感激。谢谢!
【问题讨论】:
-
有时是一个,有时是另一个,如果您也指的是第 3 方模块。它们应该始终是异步的,但并非所有开发人员都是完美的。
-
回调可以是任何一种。另一方面,Promise 将总是异步(只要它们遵循 Promise/A+ 规范)。
-
猜猜这取决于您认为
callback。
标签: javascript node.js asynchronous callback