簡體   English   中英

如何將此阻塞代碼重構為對node.js非阻塞

[英]How to refactor this blocking code to non blocking for 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});
}

因此,此代碼將阻塞,直到生成發票編號。 我需要一些技巧和提示,以了解如何重構此功能以使其不受阻礙。

由於您的代碼本質上都是同步的,例如:您沒有進行任何IO調用,因此您無法使該代碼異步:(

異步代碼必須正在進行IO調用,如下所示:

  • 寫入磁盤。
  • 通過網絡交談。
  • 調用子流程並等待響應。

這些事情都可以異步進行,因為您的程序只是在等待其他硬件來做某事:處理結果,發送響應等。

在您的代碼中,您只是在執行一些CPU操作:if語句,字符串比較等。這些東西始終必須直接由CPU處理,既然如此,您就無法“等待”完成”,可以這么說。

如果您確實打算進行異步處理,則可以執行以下操作:

  • 編寫執行這些同步任務的API服務。
  • 通過網絡公開該API服務: http//blah.com/api
  • 重寫您的本地節點代碼以對該API進行異步調用,然后等待結果。

然而,事實是,由於代碼幾乎是最小同步的,因此您不需要執行上述操作。 所有項目中都有一些同步代碼-沒有轉義=)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM