Javascript 如何将node.js的阻塞代码重构为非阻塞代码

Javascript 如何将node.js的阻塞代码重构为非阻塞代码,javascript,node.js,Javascript,Node.js,我需要将这段代码重构为非阻塞代码 我已经写了一个简单的助手代码,它的作用是根据前面提供的号码生成发票号码 helper.js module.exports = { replaceCharAt: function replaceCharAt(string, index, character){ var string = string.split(''); string[index] = character; return string.join(''); },

我需要将这段代码重构为非阻塞代码

我已经写了一个简单的助手代码,它的作用是根据前面提供的号码生成发票号码

helper.js

module.exports = {
  replaceCharAt: function replaceCharAt(string, index, character){
    var string = string.split('');
    string[index] = character;
    return string.join('');
  },
  generateInvoiceNumber: function generateInvoiceNumber(invoiceNumber, useIndex){
    var invoiceNumber = invoiceNumber.trim();
    if(typeof useIndex === 'undefined' || useIndex === -1 ){
      useIndex = invoiceNumber.length - 1;
    }
    var incrementChar = invoiceNumber[useIndex];
    if(incrementChar == '9' || incrementChar == 'z' || incrementChar == 'Z'){
      if(incrementChar == 9){
        invoiceNumber = this.replaceCharAt(invoiceNumber, useIndex, '0');
      }
      else{
        invoiceNumber = this.replaceCharAt(invoiceNumber, useIndex, 'a');
      }
      if(useIndex === 0){
        return invoiceNumber = '1'+invoiceNumber;
      }
      return this.generateInvoiceNumber(invoiceNumber, useIndex - 1);
    }
    else{
      var replaceChar = String.fromCharCode(incrementChar.charCodeAt(0) + 1);
      invoiceNumber = this.replaceCharAt(invoiceNumber, useIndex, replaceChar);
    }
    return invoiceNumber;
  }
};
如何在请求处理程序中使用它

var helper = require('./helper');

var handler = function(request, reply){
  var newNumber = helper.generateInvoiceNumber(request.params.oldNumber);
  reply({newNumber: newNumber});
}

因此,此代码会一直阻塞,直到生成发票号为止。我需要一些技巧和提示,告诉我如何重构它以避免阻塞

由于您的代码本质上都是同步的,例如:您没有进行任何IO调用,因此无法使此代码异步:(

异步代码必须进行IO调用,如下所示:

  • 写入磁盘
  • 通过网络交谈
  • 调用子进程并等待响应
这些事情都可以是异步的,因为您的程序只是在等待其他硬件执行某些操作:处理结果、发送响应等

在您的代码中,您只需执行一些CPU操作:if语句、字符串比较等。这些内容始终必须由您的CPU直接处理,既然如此,您就没有办法“等待它完成”,可以这么说

如果您真的想使其异步,可以执行以下操作:

  • 编写执行这些同步任务的API服务
  • 通过网络公开该API服务:
  • 重写本地节点代码以对该API进行异步调用并等待结果

然而,事实是,由于代码的同步性非常低,因此不需要执行上述操作。所有项目中都有一些同步代码——没有转义=)

该函数中没有IO,因此,我不认为将其转换为使用回调/承诺等有任何用处。我不清楚这是否会阻塞,因为它使用递归来生成发票号。我想这将非常快,所以不需要将此异步正确?最终,除非将代码移到子进程中,只有I/O操作在节点中是非阻塞的,节点本身是阻塞的。可能会让您更好地理解这些差异。如果您只是沿着生成一个新的子进程的路线走,那么是的,它也会阻止这一点,您在这里所做的只是移动瓶颈。最好的方法是让外部系统生成发票号,例如数据库脚本、批处理文件,甚至是多线程web服务,如ASP.NET/PHP等。