Подтвердить что ты не робот

Запись "блокирующего" кода в nodejs

Все в nodejs является неблокирующим, что приятно, но как бы я хотел бы сделать все функции, которые должны быть один за другим без огромного вложенного списка обратных вызовов?

4b9b3361

Ответ 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

Использовать Step.

Это "простая библиотека потока управления для 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)
})
};