Общение между модулями
Здравствуйте. Прошу прощения, если подобное обсуждение уже существует.
Ситуация следующая: Есть условно главный скрипт, к которому подключены другие скрипты через var abc = require('./abc') и в самом abc реализован module.exports. Таких скриптов abc например три. Главный скрипт должен асинхронно запускать все три скрипта и отслеживать, когда закончат выполнение все три скрипта, после этого выполняет ряд действий. Как это лучше реализовать? |
например, у этих трех скриптов выполнение действий происходит в некоторой функции run, возвращающей промис.
var a = require('./a'); var b = require('./b'); var c = require('./c'); Promise.all([a.run(), b.run(), c.run()]).then(function(arrayResults) { //тут что-то делаем }); |
Самый дедовский (почти) метод - это колбэк-функция. Это просто.
Объявляем функцию и в аргумент ей пишем - callback (ну или любую кракозябру, как это называется - не важно). А в конце вызов этого (какого-то) колбэка. function foo(callback) { var result = {}; // здесь реквайрятся ваши сторонние модули // и в какой-то объект - result - собираются результаты их работы callback(result); //сюда передаём результат тех реквайров } Он-то и предназначен для ваших действий, которые "потом". Теперь вызываем нашу функцию с реквайрами: foo( function(result) { // а вот и колбэк, в который с аргументом попал результат предыдущих // операций, и где вы делаете с ним ваши действия "потом" }); Есть ещё более "дедовский" способ, но меня тут настоящие программисты сразу заклюют. |
Цитата:
А как правильно передать из всех модулей в главный скрипт информацию о том, что они выполнены? |
Цитата:
Если бы я знал, что существуют промисы раньше.... ) у меня весь проект на колбеках, хотя промисы куда удобнее на мой взгляд |
Цитата:
const fs = require('fs'); var parse = function (csrf){ return new function(){ this.clearFile = function(){ fs.writeFileSync('./data/prices.txt', ''); return; } } } module.exports = parse; Я вызывал выполнение функции из главного скрипта кодом a().clearFile() Как теперь сюда вставить возвращающий промис?) |
Я извиняюсь, а что делает этот модуль? Теоретически можно предположить, что он записывает в файл пустую строку (попросту, создаёт файл price.txt). Но тогда он должен выглядеть как-то так:
const fs = require('fs'); var parse = function (){ fs.writeFileSync('./data/prices.txt', '', err => console.error(err)); }; module.exports = parse; А лучше так: var fs = require('fs'); module.exports = function() { fs.writeFileSync('./data/prices.txt', '', err => console.error(err)); }; И вызываться так: require('./parse')(); // тут должно быть имя файла с модулем - я не знаю, как он называется И поскольку возвращать ему нечего (да хоть бы и было чего), то и в переменную - var a = - его передавать незачем - так его и засунуть в массив промиса. |
Цитата:
Просто 100 строк кода скидывать было бы не совсем разумным, на мой взгляд. Вот как в приведённый мной пример можно интегрировать промисы? Или, если можно, просто приведите холостой пример, в котором выполняется некоторый модуль(пусть это будет таймаут 3 секунды например), и после выполнения из модуля поступает информация в основной шаблон, что модуль выполнился. Причём чтобы сам промис и ".then" объявлялись в основном шаблоне. Возможно такое? var a = require('./a'); var b = require('./b'); var c = require('./c'); Promise.all([a.run(), b.run(), c.run()]).then(function(arrayResults) { //тут что-то делаем }); Вот если можно в пример выше добавьте отдельно короткий код любого из модулей а b или c, который возвращает промис. |
В общем то могу сократить и обобщить все вопросы.
Как из модуля можно что-то передать в основной скрипт или, например, вызвать функцию, объявленную в основном скрипте? |
Я не понимаю ваших задач-вопросов - зачем нужно куда-то какие-то сведения о выполнении отправлять? Вы можете делать из файла-модуля хоть 100500 разных экспотров. Вот файл, который называется file.js
module.exports = function(bla) { ... ... ... }; function Bar() { ... } exports.Bar = Bar; exports.foo = function(blabla) { ... }; Можно запросить его какбэ основную часть, которая есть просто анонимная функция, "function expression" (или "лямбда-функция", я извиняюсь; JavaScript - это же наследник великого Lisp среди си-образных языков). Запросить и сразу вызвать, и с передачей значения аргумента - require('./file')(tra); Это по смыслу то же самое, что и вот такой "вызов на месте" (типа - (funcall #'(lambda (bla) (...)) tra) - как-то так) (function(bla) { ... })(tra); А можно обратиться к файлу и вызвать отдельные функции: require('./file').Bar(); require('./file').foo(); Ну и т.д. Экспортировать можно класс - и тогда запрос может быть созданием экземпляра с передачей параметров в поля конструктора: new require('./file')(bla, tra); Всё проще, чем может показаться со стороны. И вот эта вся система "модулей" была скопипастена Райаном Далом, как мне кажется, с системы "пакетов" (package) в CommonLisp. (но там можно экспортировать только имена, как во втором варианте, а он, конечно, усовершенствовал это дело) Но это вот всё объясняется в стареньком (и хорошем) скринкасте про Node.js аффтара и владельца данного ресурса. Его можно посмотреть. |
Часовой пояс GMT +3, время: 02:24. |