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

Node.js async libs

Существует тонна библиотек, которые помогают фиксировать уровни синдрома обратного вызова.

На самом деле, слишком много, какой из них я использую?

4b9b3361

Ответ 1

Я использую Async.js.

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

<сильные > Примеры

async.map(['file1','file2','file3'], fs.stat, function(err, results){
    // results is now an array of stats for each file
});

async.filter(['file1','file2','file3'], path.exists, function(results){
    // results now equals an array of the existing files
});

async.parallel([
    function(){ ... },
    function(){ ... }
], callback);

async.series([
    function(){ ... },
    function(){ ... }
]);

Ответ 2

выберите тот, который вам нравится: P. Например, мне нравится async. Но Step также довольно знаменит. Я думаю, что очень хорошо, что существует так много модулей. Сообщество node.js выпускает некоторые действительно хорошие модули. Установка их с помощью NPM не будет стоить вам никаких усилий.

Ответ 3

Мне нравится использовать promises из Q:

Если функция не может вернуть значение или исключить исключение без блокировки, оно может вместо этого вернуть обещание. Обещание - это объект, представляющий возвращаемое значение или исключенное исключение, которое функция может в конечном итоге обеспечить. Обещание также можно использовать в качестве прокси для удаленного объекта для преодоления латентности.

На первом проходе promises может смягчить "пирамиду судьбы": ситуация, когда код переходит вправо быстрее, чем он идет вперед.

step1(function (value1) {
    step2(value1, function(value2) {
        step3(value2, function(value3) {
            step4(value3, function(value4) {
                // Do something with value4
            });
        });
    });
});

С помощью библиотеки обещаний вы можете сгладить пирамиду.

Q.fcall(step1)
.then(step2)
.then(step3)
.then(step4)
.then(function (value4) {
    // Do something with value4
}, function (error) {
    // Handle any error from step1 through step4
})
.done();

При таком подходе вы также получаете неявное распространение ошибок, например, try, catch и, наконец. Ошибка на шаге 1 будет полностью переходить к шагу 5, где его поймают и обработают.

Подход обратного вызова называется "инверсией управления". Функция, которая принимает обратный вызов вместо возвращаемого значения, говорит: "Не звоните мне, я звоню тебе". promises un-инвертировать инверсию, чисто отделяя входные аргументы от аргументов потока управления. Это упрощает использование и создание API-интерфейсов, в частности вариационных, остаточных и расширенных аргументов.

Ответ 4

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

Мне нравится функция потока внутри TaskGroup и используется для большого количества больших проектов, включая DocPad и BugHerd. Примеры приведены в README.