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

2019-06-25 02:58发布

事情是这样的:

我使用的是让我的手机(iPhone / Android的)应用程序模块化的方式CommonJS的。 这并不奇怪。 但有一两件事,我只是不在身边让我的头。

CommonJS的让我创建静态私有变量,它可以让我安心创建单身。 这一点,我觉得至少,是因为得到一个文件的内容require() d是只读一次,然后出口对象(这是只有一次初始化)返回每次。

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

等待......有趣的是,当我在写这个问题,我突然意识到,没有一个电话来require()完成下一个开始(因此堆栈溢出下面演示)前。

关于我是否在轨道或不是有什么想法? 这是过去5点过来,所以所有的赌注都关闭,据我而言: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

为什么那么像下面是循环引用不工作? (我可能会,如果你喜欢已经ansered此我自己,评论/回答就可以了)。

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)

Answer 1:

我也是使用Appcelerator的钛CommonJS的模块,来构建一个移动应用程序。 我所做的,以解决循环依赖问题是这样的:如果A和B是2圆依赖模块,B中要求(A),反之亦然之前你真正需要使用它 。 就我而言,我需要一个B的内部得到了点击某个按钮时,才让我把要求(A),B中的按钮的单击事件监听器里。 希望帮助。



文章来源: Appcelerator and CommonJS modules (caching and circular references)