Javascript 如何将node.js的阻塞代码重构为非阻塞代码
我需要将这段代码重构为非阻塞代码 我已经写了一个简单的助手代码,它的作用是根据前面提供的号码生成发票号码 helper.jsJavascript 如何将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(''); },
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调用,如下所示:
- 写入磁盘
- 通过网络交谈
- 调用子进程并等待响应
- 编写执行这些同步任务的API服务
- 通过网络公开该API服务:
- 重写本地节点代码以对该API进行异步调用并等待结果
然而,事实是,由于代码的同步性非常低,因此不需要执行上述操作。所有项目中都有一些同步代码——没有转义=)该函数中没有IO,因此,我不认为将其转换为使用回调/承诺等有任何用处。我不清楚这是否会阻塞,因为它使用递归来生成发票号。我想这将非常快,所以不需要将此异步正确?最终,除非将代码移到子进程中,只有I/O操作在节点中是非阻塞的,节点本身是阻塞的。可能会让您更好地理解这些差异。如果您只是沿着生成一个新的子进程的路线走,那么是的,它也会阻止这一点,您在这里所做的只是移动瓶颈。最好的方法是让外部系统生成发票号,例如数据库脚本、批处理文件,甚至是多线程web服务,如ASP.NET/PHP等。