Все в nodejs является неблокирующим, что приятно, но как бы я хотел бы сделать все функции, которые должны быть один за другим без огромного вложенного списка обратных вызовов?
Запись "блокирующего" кода в nodejs
Ответ 1
Вы не должны вставлять свои обратные вызовы.
В написании асинхронного кода существует много шаблонов.
Например, этот матрешка-вложенный стиль...
database.find('foo', function (err, data) {
database.update('foo', 'bar', function (err, data) {
database.delete('bar', function (err, data) {
console.log(data);
});
});
});
... можно переписать в более чистом (но более подробном) способе:
var onDelete = function (err, data) {
console.log(data);
},
onUpdate = function (err, data) {
database.delete('bar', onDelete);
},
onFind = function (err, data) {
database.update('foo', 'bar', onUpdate);
};
database.find('foo', onFind);
Другая опция - использовать модуль для абстрактного последовательного и параллельного выполнения обратных вызовов.
Ответ 2
Это "простая библиотека потока управления для node.JS, которая делает параллельное выполнение, серийное выполнение и обработку ошибок безболезненными".
Ответ 3
То, что вы действительно хотите сделать, это выяснить, почему ваши операции блокируют и перекодируют их, чтобы они не блокировались. Удалите зависимости друг от друга. Вам нужно изменить то, как вы думаете о неблокирующем IO.
Использование библиотеки, позволяющей вам запускать этот тип кода с синхронной блокировкой, - это просто плохой костыль.
Вам будет значительно лучше научиться писать неблокирующий код в node.js, потому что это то, что он предназначен.
Ответ 4
асинхронный модуль является особенно хорошим решением - использование его приводит к значительно более чистым асинхронным кодам с гораздо более мелким вложением. Вы можете получить его через:
npm install async --save
Особенно взгляните на:
- async.series: это позволяет вам настроить список функций, запускаемых один за другим, - каждый из них запускается только после того, как он был завершен. Однако другой код (вне определенной серии) может работать без блокировки.
- async.series: это похоже на async.series, за исключением того, что каждая функция в списке передает свой результат следующему в списке, а конечный результат передается на обратный вызов, определенный в конце.
Однако все методы управления потоком асинхронного потока очень полезны для исключения огромных вложенных списков обратных вызовов.
Кроме того, если это помогает, здесь jsFiddle я собрал при изучении библиотеки, содержащей набор примеров, в том числе один для async. водопад и другое для async.series(откройте консоль, чтобы увидеть, что она делает).
Ответ 5
use ES6 async and await method for writing blocking code
====================================================================
Ex:
async function fName(){
lat firstResult=await task1;
let secondResult= await task2
}
function task1(){
//write your logic and after finishing your task return result as a PROMISE
return new Promise((reslove,reject)=>{
// write logic hear after reslove(success) or reject(error)
})
}
function task2(){
//write your logic and after finishing your task return result as a PROMISE
return new Promise((reslove,reject)=>{
// write logic hear after reslove(success) or reject(error)
})
};