Существует тонна библиотек, которые помогают фиксировать уровни синдрома обратного вызова.
На самом деле, слишком много, какой из них я использую?
Существует тонна библиотек, которые помогают фиксировать уровни синдрома обратного вызова.
На самом деле, слишком много, какой из них я использую?
Я использую 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(){ ... }
]);
выберите тот, который вам нравится: P. Например, мне нравится async. Но Step также довольно знаменит. Я думаю, что очень хорошо, что существует так много модулей. Сообщество node.js выпускает некоторые действительно хорошие модули. Установка их с помощью NPM не будет стоить вам никаких усилий.
Мне нравится использовать 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-интерфейсов, в частности вариационных, остаточных и расширенных аргументов.
Проблема с другими библиотеками синхронизации заключается в том, что мне часто нужно было определить все мои задачи в начале и не предлагать чистый интуитивно понятный API, который я нашел. Я просто хотел нажимать задачи группе, всякий раз и каждый раз, а затем выполнять эту группу либо параллельно, либо серийно.
Мне нравится функция потока внутри TaskGroup и используется для большого количества больших проектов, включая DocPad и BugHerd. Примеры приведены в README.