Appcelerator和CommonJS模块(缓存和循环引用)

这是事情:

我正在使用CommonJS将我的移动(iPhone / Android)应用程序模块化。 那里没有什么惊喜 但有一件事我无法理解。

CommonJS让我创建STATIC私有变量,这让我可以轻松创建单身人士。 我认为这至少是因为获取require() d的文件的内容只读取一次,然后每次都会返回exports对象(仅初始化一次)。

但是当我创建如下所示的循环引用时,包含模块中的代码每次都会执行。

等等......有趣的是,在我写这个问题的时候,我突然意识到没有一个调用require()在下一个调用开始之前完成(因此堆栈溢出如下所示)。

有没有想过我是否有轨道? 现在已经过了凌晨五点,所以所有的投注都是关于我所关注的:D。

例子:

看到这段代码,它定义了一个单例:

/* Singleton.js */

exports.getSingleton = getSingleton;

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

  return instance;
}

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

var instance;

require()这样的文件:

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

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

输出是:

[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

那么为什么像以下这样的循环引用不起作用? (如果你喜欢,我可能已经亲自动手了,评论/回答就可以了)。

app.js

require('Banana');

Pinapple.js

require('Banana');

Banana.js

require('Pineapple');

因为输出是这样的:

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

我也在Appcelerator Titanium中使用CommonJS模块来构建移动应用程序。 我所做的解决循环依赖问题的方法是:如果A和B是2个循环相关模块,则需要B中的(A),反之亦然,然后才需要使用它。 在我的情况下,只有当某个按钮被点击时,我才需要B中的A,所以我在B的按钮的click事件监听器中放置了一个require(A)。 希望有所帮助。

链接地址: http://www.djcxy.com/p/17373.html

上一篇: Appcelerator and CommonJS modules (caching and circular references)

下一篇: module.exports vs exports in Node.js