我正在学习node.js而且我对异步非阻塞I / O的大部分基础知识都有所了解。我的问题是当函数本身不是异步时,用回调创建函数是什么意思。即使您正在创建的函数调用异步函数,我也找不到您使用回调的原因。我在node.js代码中看到了很多,我正在看。
例如,一个发送HTTP请求并返回请求的解析输出的函数:
function withCallback(url, callback) {
request(url, function(err, response, html) {
if (err)
callback(err, null);
callback(null, JSON.parse(html));
});
}
function withoutCallback(url) {
request(url, function(err, response, html) {
if (err)
throw err;
return JSON.parse(html);
});
}
带回调的第一个函数通过回调返回结果,而第二个函数只是正常返回它。
答案 0 :(得分:1)
准备写评论,但有点太长了。
你问了几个问题。为了解决评论者提出的非常正确的观点,第二个例子不起作用,因为@Hawkings更清楚地表明,结果无法捕获(通过你的代码)。它不起作用,因为正在调用第二个示例中的return
正在创建的匿名函数(传递给request
的实际回调)并将其结果返回到request
内功能。此外,在您的示例中,控件在调用withoutCallback
行之前已经返回return JSON.parse()
的调用者,并且正如所写,foo = withoutCallback(...)
将导致foo
被调用未定义。
如果你看一下使用回调的库的代码,你会看到如何调用这些代码,这可能更有意义,为什么这不起作用。 (虽然我建议查看一个比请求更简单的库 - 如果你对节点很新,我想你会发现请求库有点令人困惑。)
但是,在你陈述你的问题的情况下(你的例子中没有说明):“我的问题是当函数本身不是异步时,用回调创建一个函数是什么意思[?]”
在这种情况下没有太多意义,除非a)你希望将来证明它,以防它因为增加的功能而变得异步或b)你想拥有一个其他实现是异步的公共接口。要使用浏览器示例只是因为很容易想到,如果您正在实现通用基本数据存储解决方案,其中一个实现将使用LocalStorage(同步),但其他可能使用IndexedDB或远程调用(都是异步) - 您仍然希望使用回调编写LocalStorage实现,以便您可以轻松地在实现之间切换。
如果您不喜欢回调样式,请考虑学习使用,并使用利用其他技术或语言功能的库来处理异步性,包括Promises,Generators或适用的情况,EventEmitters。我本人是Promises的忠实粉丝。话虽如此,我不会建议任何这些,直到你了解你的回调和为什么回调。