是否可以编写异步Node.js代码“清洁”?

在Node.js中进行编码时,我遇到很多情况,因为很难实现与数据库查询(I / O)混合的精细逻辑.

考虑一个python编写的例子.我们需要遍历一个值数组,对于我们查询数据库的每个值,然后,根据结果,我们需要计算平均值.

def foo:
  a = [1,2,3,4,5]
  result = 0
  for i in a:
    record = find_from_db(i) # I/O operation
    if not record:
      raise Error('No record exist for %d' % i)
    result += record.value

  return result / len(a)

Node.js中的相同任务

function foo(callback) {
  var a = [1,5];
  var result = 0;
  var itemProcessed = 0;
  var error;
  function final() {
    if (itemProcessed == a.length) {
      if (error) {
        callback(error);
      } else {
        callback(null,result / a.length);
      }
    }
  }
  a.forEach(function(i) {
    // I/O operation
    findFromDb(function(err,record) {
      itemProcessed++;
      if (err) {
        error = err;
      } else if (!record) {
        error = 'No record exist for ' + i;
      } else {
        result += record.value;
      }
      final();
    });
  });
}

您可以看到这样的代码更难写/读,并且更容易出错.
我的问题:

>有没有办法使Node.js上面的代码更清洁?
>想象一下更复杂的逻辑.例如,当我们从db获取记录时,我们可能需要根据某些条件执行另一个db查询.在Node.js中成为一场噩梦.处理此类任务的常见模式是什么?
>根据您的经验,使用Node.js进行编码时,性能提升是否值得降低生产力?
>是否有其他更易于使用的异步I / O框架/语言?

解决方法

回答你的问题:

> async这样的库在处理异步任务时为常见场景提供了各种解决方案.对于“回调地狱”问题,有很多方法可以避免这种情况,包括(但不限于)命名您的功能并将其拉出来,模块化您的代码以及使用承诺.>或多或少你现在拥有的是一个相当常见的模式:具有一系列函数可以调用的计数器和函数索引变量.同样,异步可以在这里提供帮助,因为它可以减少您可能会经常重复的这种样板. async目前没有真正允许跳过单个任务的方法,但如果您正在编写样板文件(例如,仅将函数索引变量增加2),您可以自己轻松地执行此操作.>根据我自己的经验,如果你正确设计你的javascript代码并考虑异步,并使用很多像async这样的工具,你会发现用节点开发更容易.在节点中编写异步与同步通常总是会更复杂(尽管与回调/承诺相比,生成器,光纤等更少).>我个人认为根据这一方面决定一种语言是不值得的.您必须考虑的不仅仅是语言的设计,例如社区的大小,第三方库的可用性,性能,技术支持选项,代码调试的简易性等.

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...