2016-03-18 7 views
-3

У меня нет конкретной проблемы, но я хотел бы получить мнение от других о моих собственных сомнениях. Я не продвинутый разработчик, поэтому, если я говорю глупо или совершенно неправильно, не стесняйтесь меня исправлять и нести со мной, я здесь, чтобы учиться.Использование для асинхронного программирования (NodeJS)

Я недавно использовал NodeJS, и, конечно, большая часть моего кода написана асинхронно. Тем не менее, я подумал о нескольких вещах:

Мне труднее написать читаемый код, с потоком, который легко рассуждать, когда я написал асинхронный код, а не синхронный. Я также часто получаю много вложенных обратных вызовов. Позже я узнал о обещаниях, и я думаю, что это улучшает все, но даже с обещаниями я чувствую, что код, который я пишу, по-прежнему трудно поддерживать и подвержен ошибкам.

Я также понял, что много времени я предпочитаю делать синхронные вызовы, но я более или менее вынужден использовать асинхронные вызовы, потому что библиотеки предоставляют только асинхронные интерфейсы. Например, очень часто мне нужно получить данные из базы данных и в конечном итоге написать асинхронный код для запроса базы данных, или в другой ситуации мне нужно сделать запрос на сервер (например, чтобы получить токен для использования сторонней службы), но во всех этих ситуациях мне нужно получить данные (будь то данные из db или токена или что-то еще) перед отправкой собственного ответа, поэтому мне нужно подождать. Но я в конечном итоге вынужден писать асинхронный код, в то время как я чувствую, что синхронный код будет более естественным и более читаемым.

Я знаю, что с NodeJS я не должен блокировать основной поток синхронными вызовами, поэтому кажется, что асинхронное программирование - единственный способ пойти. Но я хотел бы знать, должен ли я просто отказаться от NodeJS и пойти на что-то еще, что позволит мне написать синхронный код, или если что-то, что я пропустил в NodeJS.

+2

I/O практически всегда асинхронен. Даже если вы можете сделать это синхронно, он не будет масштабироваться. Представьте, что веб-браузер был однопоточным и выполнял синхронный ввод-вывод. Я не смог бы использовать браузер во время загрузки файла (даже не говоря о том, как медленная и безответственная загрузка сайта будет). Что делать, полностью зависит от того, что вы строите. Но привыкание и обучение асинхронному программированию, безусловно, будет более полезным. –

+0

@ Можете ли вы, пожалуйста, показать некоторые из вашего кода, который вам трудно читать? –

ответ

1

Выбор языка или рамки будет основываться на вашем прецеденте. Предпочтение придет после. Это правда, что в большинстве случаев более синхронный ориентированный язык намного проще поддерживать и читать (я смотрю на вас на Python). Но возьмите это, например:

  • Вам необходимо сделать что-то, что требует выполнения нескольких задач, и вы хотите получить результат раньше. Конечно, делать это синхронно, это замедлит вас. Лучше всего написать код на языке или фреймворке, который встроен в параллелизм: NodeJS, Erlang, Go

  • Вам нужно написать сценарий, который должен переходить через ресурсы в последовательном порядке. В то время как это может быть сделано на языках, указанных на моем предыдущем сценарии, это, вероятно, лучше для вас, чтобы прибегать на язык или основы, которая делает это более легко: Python, Ruby, Perl

На мой взгляд, это хорошо узнать NodeJS. Помните, что вы не должны зацикливаться на одном языке на всю жизнь.

1

Пообещайте устранить проблему с читабельностью.

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

Обещания являются частью ES6. В качестве предупреждения: они не сразу «очевидны». Составьте несколько примеров, пока не упадет пенни. Вы будете рады, что вы это сделали. Также используйте Bluebird.

Не сдавайтесь на узле. Это действительно красота.

1

Для решения проблем в асинхронном мире требуются асинхронные программы. И наш межсетевой мир определенно асинхронен. Вы просто не можете написать программу, которая предполагает ожидание чего-то синхронно. Вам не нужно писать синхронную или асинхронную программу; проблема решает это для вас.

Лучшее, что вы можете сделать, это найти языки и фреймворки, которые упрощают работу. В JS асинхронные функции с await - это продвижение, которое позволяет писать асинхронные программы в стиле, близком к человеческому, возможно, синхронному.

+0

Если это асинхронный мир, почему только сейчас асинхронное программирование, похоже, взорвалось на сцене? – Jodes

+0

@Jodes Асинхронное программирование существует с тех пор, как 'SetTimeout' прибыл в Netscape 2, а затем XMLHTTPRequest/ajax более 15 лет назад. То, что изменилось, а не «только сейчас», но больше похоже на начало пять лет назад, заключается в том, что мы улучшили парадигмы в JS для борьбы с ним, такие как обещания, асинхронные функции и наблюдаемые. –

Смежные вопросы