 
			
				21.07.2017, 12:54
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.04.2017 
					
					
					
						Сообщений: 21
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Общение между модулями
			 
			
		
		
		
		Здравствуйте. Прошу прощения, если подобное обсуждение уже существует. 
 
Ситуация следующая:  
Есть условно главный скрипт, к которому подключены другие скрипты через var abc = require('./abc') и  в самом abc реализован module.exports. 
Таких скриптов abc например три. Главный скрипт должен асинхронно запускать все три скрипта и отслеживать, когда закончат выполнение все три скрипта, после этого выполняет ряд действий. 
 
Как это лучше реализовать? 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.07.2017, 13:42
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.10.2016 
					
					
					
						Сообщений: 1,013
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		например, у этих трех скриптов выполнение действий происходит в некоторой функции run, возвращающей промис. 
var a = require('./a');
var b = require('./b');
var c = require('./c');
Promise.all([a.run(), b.run(), c.run()]).then(function(arrayResults) {
  //тут что-то делаем
});
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.07.2017, 13:55
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.04.2017 
					
					
					
						Сообщений: 214
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Самый дедовский (почти) метод - это колбэк-функция. Это просто. 
Объявляем функцию и в аргумент ей пишем - callback (ну или любую кракозябру, как это называется - не важно). А в конце вызов этого (какого-то) колбэка.
 
function foo(callback) {
  var result = {};
  // здесь реквайрятся ваши сторонние модули
  // и в какой-то объект - result - собираются результаты их работы
  
  callback(result); //сюда передаём результат тех реквайров
}
Он-то и предназначен для ваших действий, которые "потом". 
Теперь вызываем нашу функцию с реквайрами:
 
foo( function(result) {
  // а вот и колбэк, в который с аргументом попал результат предыдущих
  // операций, и где вы делаете с ним ваши действия "потом" 
});
Есть ещё более "дедовский" способ, но меня тут настоящие программисты сразу заклюют.  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Audaxviator, 21.07.2017 в 15:51.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.07.2017, 16:15
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.04.2017 
					
					
					
						Сообщений: 21
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Audaxviator
			 
		
	 | 
 
	
		Самый дедовский (почти) метод - это колбэк-функция. Это просто. 
Объявляем функцию и в аргумент ей пишем - callback (ну или любую кракозябру, как это называется - не важно). А в конце вызов этого (какого-то) колбэка. 
function foo(callback) {
  var result = {};
  // здесь реквайрятся ваши сторонние модули
  // и в какой-то объект - result - собираются результаты их работы
  
  callback(result); //сюда передаём результат тех реквайров
}
 
Он-то и предназначен для ваших действий, которые "потом". 
Теперь вызываем нашу функцию с реквайрами: 
foo( function(result) {
  // а вот и колбэк, в который с аргументом попал результат предыдущих
  // операций, и где вы делаете с ним ваши действия "потом" 
});
 
Есть ещё более "дедовский" способ, но меня тут настоящие программисты сразу заклюют.
	 | 
 
	
 
 Спасибо большое за подробный ответ. С колбеками я знаком.  
А как правильно передать из всех модулей в главный скрипт информацию о том, что они выполнены?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.07.2017, 16:17
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.04.2017 
					
					
					
						Сообщений: 21
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Alexandroppolus
			 
		
	 | 
 
	
		например, у этих трех скриптов выполнение действий происходит в некоторой функции run, возвращающей промис. 
 
var a = require('./a');
var b = require('./b');
var c = require('./c');
Promise.all([a.run(), b.run(), c.run()]).then(function(arrayResults) {
  //тут что-то делаем
});
	 | 
 
	
 
 Этот вариант вообще бомба. Спасибо огромное
 
Если бы я знал, что существуют промисы раньше.... ) у меня весь проект на колбеках, хотя промисы куда удобнее на мой взгляд  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось -FIXER-, 21.07.2017 в 16:32.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.07.2017, 17:21
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.04.2017 
					
					
					
						Сообщений: 21
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Alexandroppolus
			 
		
	 | 
 
	
		например, у этих трех скриптов выполнение действий происходит в некоторой функции run, возвращающей промис. 
 
var a = require('./a');
var b = require('./b');
var c = require('./c');
Promise.all([a.run(), b.run(), c.run()]).then(function(arrayResults) {
  //тут что-то делаем
});
	 | 
 
	
 
 Как в этом коде должен выглядеть подключенный модуль 'a', если до этого он имел вид:
 
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()
 
Как теперь сюда вставить возвращающий промис?)  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.07.2017, 19:13
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.04.2017 
					
					
					
						Сообщений: 214
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Я извиняюсь, а что делает этот модуль? Теоретически можно предположить, что он записывает в файл пустую строку (попросту, создаёт файл 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 = - его передавать незачем - так его и засунуть в массив промиса.  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Audaxviator, 21.07.2017 в 21:02.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.07.2017, 01:15
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.04.2017 
					
					
					
						Сообщений: 21
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Audaxviator
			 
		
	 | 
 
	
		Я извиняюсь, а что делает этот модуль? Теоретически можно предположить, что он записывает в файл пустую строку (попросту, создаёт файл 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 = - его передавать незачем - так его и засунуть в массив промиса.
	 | 
 
	
 
 Я модуль постарался максимально ужать, просто для примера.  В аргументе "csrf" я передаю функцию, которая посреди выполнения кода забирает одну переменную и передаёт её в основной скрипт. С созданным файлом в последствии происходят действия, с некоторого ресурса пост запросами парсятся цены и т.д.  
Просто 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, который возвращает промис.  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось -FIXER-, 22.07.2017 в 01:34.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.07.2017, 01:41
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.04.2017 
					
					
					
						Сообщений: 21
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 В общем то могу сократить и обобщить все вопросы.  
Как из модуля можно что-то передать в основной скрипт или, например, вызвать функцию, объявленную в основном скрипте? 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.07.2017, 09:51
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.04.2017 
					
					
					
						Сообщений: 214
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Я не понимаю ваших задач-вопросов - зачем нужно куда-то какие-то сведения о выполнении отправлять? Вы можете делать из файла-модуля хоть 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 аффтара и владельца данного ресурса. Его можно посмотреть.  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Audaxviator, 22.07.2017 в 10:15.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |