node.js中不必要的回调用法?

时间:2015-10-17 02:29:25

标签: javascript node.js asynchronous callback nonblocking

我正在学习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);
  });
}

带回调的第一个函数通过回调返回结果,而第二个函数只是正常返回它。

1 个答案:

答案 0 :(得分:1)

准备写评论,但有点太长了。

你问了几个问题。为了解决评论者提出的非常正确的观点,第二个例子不起作用,因为@Hawkings更清楚地表明,结果无法捕获(通过你的代码)。它不起作用,因为正在调用第二个示例中的return正在创建的匿名函数(传递给request的实际回调)并将其结果返回到request内功能。此外,在您的示例中,控件在调用withoutCallback行之前已经返回return JSON.parse()的调用者,并且正如所写,foo = withoutCallback(...)将导致foo被调用未定义。

如果你看一下使用回调的库的代码,你会看到如何调用这些代码,这可能更有意义,为什么这不起作用。 (虽然我建议查看一个比请求更简单的库 - 如果你对节点很新,我想你会发现请求库有点令人困惑。)

但是,在你陈述你的问题的情况下(你的例子中没有说明):“我的问题是当函数本身不是异步时,用回调创建一个函数是什么意思[?]”

在这种情况下没有太多意义,除非a)你希望将来证明它,以防它因为增加的功能而变得异步或b)你想拥有一个其他实现是异步的公共接口。要使用浏览器示例只是因为很容易想到,如果您正在实现通用基本数据存储解决方案,其中一个实现将使用LocalStorage(同步),但其他可能使用IndexedDB或远程调用(都是异步) - 您仍然希望使用回调编写LocalStorage实现,以便您可以轻松地在实现之间切换。

如果您不喜欢回调样式,请考虑学习使用,并使用利用其他技术或语言功能的库来处理异步性,包括Promises,Generators或适用的情况,EventEmitters。我本人是Promises的忠实粉丝。话虽如此,我不会建议任何这些,直到你了解你的回调和为什么回调。