2012-04-23 7 views
3

EDITО стиле кода узла

ТНХ для ответов на все вопросы,
и, наконец, я решил использовать некоторые инструменты, такие как 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 
       } 
     } 
    } 
} 

коды, как это трудно читать.

Я знаю, что «отложенная» библиотека может решить такую ​​проблему,
Есть ли хороший «отложенный» модуль для узла?
И как производительность, если я закодирую узел с «отложенным»?

+0

это стиль кода по умолчанию ... как это может быть труднее прочитать? не понимаю. – Cynede

+0

Вам не нужно откладывать, вам нужно правильно использовать поток управления. Также знайте, как научиться эффективно использовать обратные вызовы – Raynos

ответ

4

Это является большая проблема с узлом на основе кода; вы часто выращиваете «обратные пирамиды». Есть несколько подходов к решению проблемы:

Код стиль:

Используйте эту неприятность, как возможность разбить код на куски размера укуса. Это означает, что у вас, вероятно, будет множество крошечных именных функций - это, наверное, просто отлично! Вы также можете найти больше возможностей для повторного использования.

Библиотеки Flow-контроль

Есть ровно 593.72 млрд библиотек управления потоком там. Вот некоторые из наиболее популярных из них:

  • Step супер базовый серийный & управление параллельный поток.
  • seq - это более тяжелая, но более полнофункциональная библиотека управления потоком.
  • Есть еще много. Поиск the npm registry для «потока» и «управления потоком» (извините, не кажется, связываемыми)

расширения языка

Есть несколько попыток обеспечить более синхронное чувство синтаксиса сверху JavaScript (или CoffeeScript), часто основанный на концепциях, лежащих в основе tame paper.

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

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

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

Будущего:

Ядро команда узла очень осведомлена о проблеме, а также работает на более низких компонентах уровня, чтобы помочь облегчить боль. Похоже, что они будут вводить a basic version of domains в v0.8, которые обеспечивают способ сворачивания обработки ошибок (в первую очередь, избегая общего шаблона return err if err).

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

Ссылки:

0

Есть некоторые библиотеки, которые могут быть полезны в некоторых сценариях, но в целом вы не будете взволнованы после использования их для всего.

В соответствии с проблемами медлительности. Поскольку node.js является асинхронным, обернутые функции не являются таким большим потребителем производительности.

Вы можете посмотреть здесь отложенной как библиотека

https://github.com/kriszyp/node-promise

Кроме того, этот вопрос очень похож

What nodejs library is most like jQuery's deferreds?

И в качестве последнего бонуса я предлагаю вам взглянуть на CoffeeScript , Это язык, который компилируется в javascript и имеет более красивый синтаксис, поскольку функции привязки удаляются

+2

CoffeeScript не решает проблему кода спагетти – pomeh

+0

Да, но это, конечно, облегчает чтение. Конечно, это вопрос мнения! – drinchev

+0

Я знаю CoffeeScript, и я думаю, что это немного лучше, чем оригинальные коды JS в ситуации «спагетти». Я всегда беспокоился о проблеме производительности на «отложенной», поэтому я решил не использовать ее. – Kevin

1

Есть тонны «отложенных библиотек». Посмотрите там http://eirikb.github.com/nipster/#promise и там http://eirikb.github.com/nipster/#deferred.Для того, чтобы выбрать один, это всего лишь вопрос стиля & простоты :)

+0

Итак, вы имеете в виду, что есть нет проблемы с производительностью при использовании «отложенных»? – Kevin

+1

Я так никогда и не сказал :) Я думаю, что отложенный не выполняет * это * хорошо, чем «собственный код», но воздействие несколько невелико. Но у меня нет показателей, чтобы сказать «да» или нет, это может быть проблемой – pomeh

1

Если вы действительно не нравится, что всегда есть альтернатива использования именованных функций, которые позволят уменьшить отступы.

Вместо

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); 

То же самое, не вложенности.

0

Я обычно люблю использовать библиотеку async.js, как он предлагает несколько различных вариантов о том, как выполнить код

Смежные вопросы