О стиле 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), часто основанный на концепциях приручающей бумаги.

  • TameJS - это ответ команды OkCupid на это.
  • IcedCoffeeScript они также портировали TameJS поверх CoffeeScript в качестве вилки.
  • streamline.js очень похож на TameJS.
  • StratifiedJS - более тяжелый подход к проблеме.

Этот маршрут является нарушителем транзакций для некоторых:

  • Это не стандартный JavaScript; если вы строите библиотеки/рамки/и т.д., поиск помощи будет более сложным.
  • Область переменных может вести себя непредсказуемыми способами, в зависимости от библиотеки.
  • Сгенерированный код может быть сложно отлаживать и сопоставлять с исходным исходным кодом.

Будущее:

Основная команда node очень хорошо разбирается в этой проблеме, а также работает над компонентами более низкого уровня, чтобы облегчить боль. Похоже, что они будут вводить базовую версию доменов в v0.8, которые обеспечивают способ сворачивания обработки ошибок (избегая общих return err if err, в первую очередь).

Это должно стать основой для более чистых библиотек управления потоками и начать прокладывать путь для более последовательного способа работы с пирамидами обратного вызова. Там слишком много выбора прямо сейчас, и сообщество не близко соглашается даже на несколько стандартов.

Литература:

Ответ 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, поскольку она предлагает несколько различных опций о том, как выполнить код