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

时间:2015-01-16 14:43:58

标签: javascript node.js

我需要将此代码重构为非阻塞。

我写了一个简单的帮助代码,它的作用是根据提供的前一个数字生成发票编号。

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});
}

因此,此代码会阻止,直到它生成发票编号。我需要一些提示和提示,如何重构这个不阻止。

1 个答案:

答案 0 :(得分:0)

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

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

  • 写入磁盘。
  • 通过网络交谈。
  • 调用子流程并等待响应。

这些东西都可以异步,因为你的程序只是在等待其他一些硬件做某事:处理结果,发送响应等。

在你的代码中,你只是简单地执行一些CPU操作:if语句,字符串比较等。这些东西总是必须由你的CPU直接处理,因为那样,那里&# 39;不能让你等到那个完成',可以这么说。

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

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

然而,事实是,由于您的代码非常简单,因此您不需要执行上述操作。所有项目都有一些同步代码 - 没有逃避它=)