node.js асинхронные библиотеки - PullRequest
56 голосов
/ 28 февраля 2011

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

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

Ответы [ 4 ]

44 голосов
/ 01 марта 2011

Я использую 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(){ ... }
]);
6 голосов
/ 28 февраля 2011

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

5 голосов
/ 14 ноября 2012

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

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

На первом проходе обещания могут смягчить «пирамиду гибели»: ситуацию, когда код движется вправо быстрее, чем вперед.

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 и finally. Ошибка на шаге 1 переместится на шаг 5, где она перехватывается и обрабатывается.

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

0 голосов
/ 19 августа 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...