Udostępnianie i modyfikowanie zmiennej między węzłem wielu plików.js
Main.js
var count = 1;
// psuedocode
// if (words typed begins with @add)
require('./add.js');
// if (words typed begins with @remove)
require('./remove.js');
// if (words typed begins with @total)
require('./total.js');
module.exports.count = count;
Razem.js
var count = require('./main.js').count;
console.log(count);
Dodaj.js
var count = require('./main.js').count;
count += 10;
console.log(count);
Usuń.js
var count = require('./main.js').count;
count -= 10;
console.log(count);
Konsola.log
1
11
-9
Background:
Mam aplikację (irc bot) i chcę dodać funkcję, którą peeps może zrobić @add 1 lub @ remove 1. Mam główną.js, który następnie wymaga różnych plików w zależności od wyzwalaczy, które są powiedziane. Więc add uruchomi dodawanie.pliku js, a to wymagałoby wtedy ('main.js") i dodać 10 (10 dla uproszczenia, to faktycznie parse numer i użyj tego numeru) do niego. Problem mam, gdy ktoś chodzi i robi @ remove. Wymaga ("main.js") i odejmuje 10 od 1, co daje -9. A Robienie @total wyszłoby 1.
Zrobiłem dość dobre poszukiwania modułu.eksport i nie natknąłem się na taki przykład jak ten, który wymieniłem powyżej. dokumenty nie zawierają żadnych przykładów zbliżonych do tego, co chcę zrobić; a te pytania 1, 2 rozumiem ... ale nie są z żadnych użyteczność dla mnie ... jak rozumiem, co tam się mówi.
Pytanie:
Chciałbym, aby zarówno @add, jak i @remove manipulowały tą samą zmienną (count ), a @total zwracało sumę count z uwzględnionymi @add i @removes. Czy używam modułu.eksportuje nieprawidłowo; czy istnieje wspólny sposób współdzielenia zmiennych, przy czym jeden plik może modyfikować zawartość modułu.eksport i zwracanie wyników do głównego.akta js?
4 answers
Twój problem polega na tym, że kiedy robisz var count = require('./main.js').count;
, dostajesz kopię tego numeru, a nie referencję. Zmiana count
nie zmienia "źródła".
Jednak powinieneś mieć funkcje eksportu plików. Wymaganie pliku uruchomi go tylko za pierwszym razem, ale po tym jest buforowany i nie uruchamia się ponownie. Zobacz dokumenty
Sugestia # 1:
// main.js
var count = 1;
var add = require('./add.js');
count = add(count);
// add.js
module.exports = function add(count) {
return count+10;
}
#2:
var count = 1;
var add = function() {
count += 10;
}
add();
# 3: osobiście stworzyłbym moduł licznika (jest to pojedyncza instancja, ale można go łatwo zrobić "Klasa"): {]}
// main.js
var counter = require('./counter.js');
counter.add();
console.log(counter.count);
// counter.js
var Counter = module.exports = {
count: 1,
add: function() {
Counter.count += 10;
},
remove: function() {
Counter.count += 10;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-31 17:35:10
Nie wiem, czy to nowe, czy nie, ale rzeczywiście możesz współdzielić zmienne między plikami jako takie:
Main.js
exports.main = {
facebook: null
};
Licznik.js
var jamie = require('./main');
console.info(jamie); //{facebook: null}
jamie.main.facebook = false;
console.info(jamie); //{facebook: false}
/ align = "left" / js
var jamie = require('./main');
console.info(jamie); //{facebook: null} //values aren't updated when importing from the same file.
jamie.main.facebook = true;
console.info(jamie); //{facebook: true}
Teraz możesz dzielić się plikami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-16 10:13:47
Mam taki sam problem jak ty.. Czasami chciałbym podzielić się zmiennymi między wieloma plikami, ponieważ uwielbiam modularny styl np. oddzielanie kontrolera, funkcji, modeli w różnych folderach/plikach na moim węźle.skrypt js, dzięki czemu mogę łatwo zarządzać kodem.
Nie wiem, czy to najlepsze rozwiązanie, ale mam nadzieję, że będzie pasować do Twoich potrzeb.Modele / dane.js
// exports empty array
module.exports = [];
Controllers / somecontroller.js
var myVar = require('../models/data');
myVar.push({name: 'Alex', age: 20});
console.log(myVar);
// [{ name: 'Alex', age: 20 }]
Controllers / anotherController.js
var myVar = require('../models/data');
console.log(myVar);
// This array has value set from somecontroller.js before...
// [{ name: 'Alex', age: 20 }]
// Put new value to array
myVar.push({name: 'John', age: 17});
console.log(myVar);
// Value will be added to an array
// [{ name: 'Alex', age: 20 }, { name: 'John', age: 17}]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-09 16:58:07
Nie ma możliwości udostępnienia odniesienia między różnymi plikami. Nie powinieneś.
Mam główną.js, który następnie wymaga różnych plików w zależności od wyzwalaczy, które są powiedzianeTo nie jest dobry pomysł. Wszystkie polecenia require, które kiedykolwiek będziesz potrzebować, muszą znajdować się na górze pliku.
Widzę też, że wymagasz main.js
w total.js
i total.js
w main.js
. Funkcja require()
importuje module.exports
pliku i przypisuje go do przestrzeni nazw zapewnij. Twój kod nie powinien być dzielony na pliki w ten sposób. Rozpakowujesz kod do osobnych plików tylko wtedy, gdy same są modułami. A jeśli tak, nie importowalibyście na siebie dwóch plików.
Warto również zauważyć, że w javascript, kiedy przypisujesz coś do przestrzeni nazw, jest to kopiowane (klonowane), jeśli jest prymitywne. Jeśli jest to obiekt, obie przestrzenie nazw odnoszą się do tego samego obiektu
var num = 5;
var prim = num;
prim++; // prim is 6, but num is still 5.
var num = {five:5};
var ob = num;
ob.five = 6;
console.log(num.five) //also 6.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-15 06:06:38