我没有具体的问题,但我想得到别人对我自己的怀疑的意见。我不是高级开发人员,所以如果我说的是愚蠢或完全错误,请不要犹豫纠正我并忍受我,我在这里学习。
我最近一直在使用NodeJS,当然,我的大部分代码都是以异步方式编写的。但是,我开始考虑几件事情:
当我编写异步代码而不是同步代码时,我很难编写可读代码,流程容易理解。我经常最终会遇到很多嵌套回调。后来,我了解了承诺,我认为它改进了整个事情,但即使有了承诺,我觉得我编写的代码仍然很难维护并且容易出错。
我也意识到很多时候,我宁愿做同步调用,但我或多或少被迫使用异步调用,因为库只提供异步接口。例如,我经常需要从数据库中获取数据并最终编写用于查询数据库的异步代码,或者在另一种情况下我需要向服务器发出请求(例如,获取令牌以使用第三方服务) ),但在所有这些情况下,我需要在发送自己的响应之前获取数据(无论是数据来自数据库还是令牌或其他),所以我需要等待。但我最终被迫编写异步代码,而我觉得同步代码会更自然,更具可读性。
我知道使用NodeJS我不应该使用同步调用阻塞主线程,所以看起来异步编程是唯一的方法。但是我想知道我是否应该放弃NodeJS并寻找其他可以让我编写同步代码的东西,或者是否有一些我错过了NodeJS的内容。
答案 0 :(得分:1)
选择您的语言或框架将取决于您的使用案例。优先权将在之后发生。确实,大多数时候,更加同步的语言更容易维护和阅读(我正在看着你的Python)。但举个例子:
您需要做一些需要完成多项任务的事情,并且您希望更快地获得结果。当然,以同步方式执行此操作会降低您的速度。最好的方法是在内置并发的语言或框架中编写代码:NodeJS,Erlang,Go
您需要编写一个应该按顺序遍历资源的脚本。虽然这可以使用我之前的场景中所述的语言来完成,但最好还是采用更容易实现此目的的语言或框架:Python,Ruby,Perl
在我看来,学习NodeJS很不错。请记住,你不应该在一生中坚持使用一种语言。
答案 1 :(得分:1)
Promise将解决您的可读性问题。
doAsync(data, function(err, result){
doAnotherAync(result, function(err, newResult){
console.log(newResult);
})
});
变为
doPromise(data)
.then(function(result){
return doAnotherPromise(result)
})
.then(function(newResult){
console.log(newResult);
});
Promise现在是ES6的一部分。作为警告:它们不是立即显而易见的#34;编写一些例子,直到便士下降。你很高兴你做到了。也可以使用Bluebird。
不要放弃Node。这真的是一件美丽的事情。
答案 2 :(得分:1)
要解决异步世界中的问题,需要异步程序。我们的互联网世界绝对是异步的。你根本无法编写一个涉及以同步方式等待某事的程序。是否编写同步或异步程序并不取决于您;问题决定了这一点。
您可以做的最好的事情是找到更容易的语言和框架。在JS中,具有await
的异步函数是一种进步,它允许您以尽可能接近同步的样式编写异步程序。