Moduły Appcelerator i CommonJS (buforowanie i odwołania cykliczne)

To jest ta rzecz:

Używam metody CommonJS, aby modułowa aplikacja mobilna (iPhone / Android). Nie ma niespodzianki. Ale jest jedna rzecz, po której nie mogę się oprzeć.

CommonJS pozwala mi tworzyć STATIC zmienne prywatne, które pozwalają mi swobodnie tworzyć single. Myślę, że przynajmniej dlatego, że zawartość pliku, który dostajerequire()d czyta się tylko raz, a następnie obiekt eksportu (który jest inicjowany tylko raz) jest zwracany za każdym razem.

Ale gdy utworzę odniesienie cykliczne, jak pokazano poniżej, kod wewnątrz dołączonego modułu jest wykonywany za każdym razem.

Czekać... Zabawne jest to, że kiedy piszę to pytanie, nagle zdaję sobie sprawę, że żadne z połączeń dorequire() zakończyć przed rozpoczęciem następnego (stąd przepełnienie stosu przedstawione poniżej).

Jakieś przemyślenia, czy jestem na dobrej drodze, czy nie? Jest już po 5 rano, więc wszystkie zakłady są wyłączone, jeśli o mnie chodzi: D.

PRZYKŁADY:

Zobacz ten fragment kodu, który definiuje singleton:

/* Singleton.js */

exports.getSingleton = getSingleton;

function getSingleton(name) {
  if (!instance) {
    instance = new Thing(name);
  }

  return instance;
}

function Thing(name) {
  this.name = name;
}

var instance;

I require() ten plik jako taki:

var theFirstThing = require('Singleton').getSingleton('first');
Ti.API.info('first: ' + theFirstThing.name)

var possiblyAnotherOtherThing = require('Singleton').getSingleton('second');
Ti.API.info('second: ' + possiblyAnotherOtherThing.name);

Wyjście to:

[DEBUG] loading: /path/to/sim/MyApp.app/app.js, resource: app_js
[DEBUG] loading: /path/to/sim/MyApp.app/Singleton.js, resource: Singleton_js
[INFO] first: first
[INFO] second: first

Dlaczego więc nie działają odniesienia cykliczne, takie jak poniższe? (Mogłem już sam to rozdzielić, komentować / odpowiadać, jeśli chcesz).

app.js

require('Banana');

Pinapple.js

require('Banana');

Banana.js

require('Pineapple');

Ponieważ wynik jest następujący:

[DEBUG] loading: /path/to/simulator/MyApp.app/app.js, resource: app_js
[DEBUG] loading: /path/to/simulator/MyApp.app/Banana.js, resource: Banana_js
[DEBUG] loading: /path/to/simulator/MyApp.app/Pineapple.js, resource: Pineapple_js
[DEBUG] loading: /path/to/simulator/MyApp.app/Banana.js, resource: Banana_js
[DEBUG] loading: /path/to/simulator/MyApp.app/Pineapple.js, resource: Pineapple_js
[DEBUG] loading: /path/to/simulator/MyApp.app/Banana.js, resource: Banana_js
[DEBUG] loading: /path/to/simulator/MyApp.app/Pineapple.js, resource: Pineapple_js
[DEBUG] loading: /path/to/simulator/MyApp.app/Banana.js, resource: Banana_js

/* etcetera (total of 15 times back and forth) */

[DEBUG] loading: /path/to/simulator/MyApp.app/Pineapple.js, resource: Pineapple_js
[DEBUG] loading: /path/to/simulator/MyApp.app/Banana.js, resource: Banana_js
[DEBUG] loading: /path/to/simulator/MyApp.app/Pineapple.js, resource: Pineapple_js
[ERROR] Script Error = Maximum call stack size exceeded. (unknown file)

questionAnswers(1)

yourAnswerToTheQuestion