О стиле Node кода
ИЗМЕНИТЬ
спасибо ко всем ответам,
и, наконец, я решил использовать некоторые инструменты, такие как Step,
все, что мне нужно, это "управление потоком" и не хочу ничего, что может замедлить производительность (я не знаю, насколько точно это повлияло бы или эффект можно просто игнорировать).
Итак, я просто создаю небольшой инструмент для управления потоком:
line.js
/**
* Create the "next" function
*
* @param {Array} tasks
* @param {Number} index
* @param {Number} last
*/
var next = function(tasks, index, last) {
if (index == last) {
return tasks[index + 1];
}
else {
return function(data) {
var nextIndex = index + 1;
tasks[nextIndex](next(tasks, nextIndex, last), data);
};
}
};
/**
* Invoke functions in line.
*/
module.exports = function() {
var tasks = arguments,
last = tasks.length - 2;
tasks[0](next(tasks, 0, last));
};
использование:
var line = require("line.js");
line(function(next) {
someObj.find(function(err, docs) {
// codes
next(docs);
});
}, function(next, docs) {
// codes
});
Надеюсь, что это поможет.
EDIT END
Как известно,
Node встроенные или сторонние модули часто предоставляют асинхронный API,
и используя функцию "обратного вызова" для обработки результатов.
Это круто, но иногда это будет выглядеть так:
//some codes
}
}
}
}
Коды, подобные этому, трудно читать.
Я знаю, что "отложенная" библиотека может решить такую проблему,
Есть ли хороший "отложенный" модуль для Node?
И как производительность, если я закодирую Node с "отложенным"?
Ответы
Ответ 1
Это большая проблема с Node кодом; вы часто выращиваете "обратные пирамиды". Существует несколько подходов к решению проблемы:
Стиль кода:
Используйте это раздражение как возможность разбить код на куски размером с укусом. Это означает, что у вас, вероятно, будет множество крошечных именных функций - возможно, это просто отлично! Вы также можете найти больше возможностей для повторного использования.
Библиотеки управления потоком
Существует точно 593,72 миллиарда библиотек контроля потока. Вот некоторые из наиболее популярных:
- Step супер базовое последовательное и параллельное управление потоками.
- seq - более тяжелая, но более полнофункциональная библиотека управления потоками.
- Там еще много. Поиск реестр npm для "потока" и "управления потоком" (извините, похоже, не привязан)
Расширения языка
Есть несколько попыток предоставить более синхронный синтаксис поверх JavaScript (или CoffeeScript), часто основанный на концепциях приручающей бумаги.
Этот маршрут является нарушителем транзакций для некоторых:
- Это не стандартный JavaScript; если вы строите библиотеки/рамки/и т.д., поиск помощи будет более сложным.
- Область переменных может вести себя непредсказуемыми способами, в зависимости от библиотеки.
- Сгенерированный код может быть сложно отлаживать и сопоставлять с исходным исходным кодом.
Будущее:
Основная команда node очень хорошо разбирается в этой проблеме, а также работает над компонентами более низкого уровня, чтобы облегчить боль. Похоже, что они будут вводить базовую версию доменов в v0.8, которые обеспечивают способ сворачивания обработки ошибок (избегая общих return err if err
, в первую очередь).
Это должно стать основой для более чистых библиотек управления потоками и начать прокладывать путь для более последовательного способа работы с пирамидами обратного вызова. Там слишком много выбора прямо сейчас, и сообщество не близко соглашается даже на несколько стандартов.
Литература:
Ответ 2
Есть тонны "отложенных библиотек". Посмотрите http://eirikb.github.com/nipster/#promise и там http://eirikb.github.com/nipster/#deferred, Чтобы выбрать один, это только вопрос стиля и простоты:)
Ответ 3
Если вам это действительно не нравится, всегда существует альтернатива использованию названных функций, что уменьшит отступ.
Вместо
setTimeout(function() {
fs.readFile('file', function (err, data) {
if (err) throw err;
console.log(data);
})
}, 200);
Вы можете сделать это:
function dataHandler(err, data)
{
if (err) throw err;
console.log(data);
}
function getFile()
{
fs.readFile('file', dataHandler);
}
setTimeout(getFile, 200);
То же самое, не гнездование.
Ответ 4
Есть несколько библиотек, которые могут быть полезны в некоторых сценариях, но в целом вы не будете взволнованы после их использования для всего.
В соответствии с проблемами медлительности. Поскольку node.js является асинхронным, обернутые функции не являются таким большим потребителем производительности.
Вы можете посмотреть здесь для библиотеки, отложенной как
https://github.com/kriszyp/node-promise
Также этот вопрос очень похож
Что такое библиотека nodejs больше всего похожа на отсрочку jQuery?
И как последний бонус, я предлагаю вам взглянуть на CoffeeScript. Это язык, который компилируется в javascript и имеет более красивый синтаксис, поскольку функции фигурных скобок удаляются
Ответ 5
Мне обычно нравится использовать библиотеку async.js, поскольку она предлагает несколько различных опций о том, как выполнить код