CommonJS singelton模块中的循环依赖关系
Circular dependencies in CommonJS singelton modules
我想知道以下是否以及如何可能:
CommonJS环境,用于节点和/或浏览器的模块(带Browserify(。
应用程序的不同部分/模块中需要提供两个(或多个(模块,每个模块返回一个单独的尔顿。它们还应该能够相互调用,因此存在循环依赖情况。我知道通过某种依赖注入是可能的,但我想避免在代码结构中,当从另一个信号调用其中一个信号的方法时,我需要调用类似this.dependents.ModuleName的东西。我希望能够直接对require语句返回的对象调用方法。
我意识到,通过两个CommonJS模块导出实例化的singelton对象(由于循环依赖关系(,这是不可能的。所以我希望可以用一个通用代码来包装它。类似于:
var Magic = require('./magic');
module.exports = Magic.createSingelton({
// ...
});
浏览由于循环依赖而失败的示例:
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var a = require('./class-a'),
b = require('./class-b');
a.printSomething();
b.printSomething();
},{"./class-a":2,"./class-b":3}],2:[function(require,module,exports){
var b = require('./class-b');
var A = function() {};
A.prototype = {
printSomething: function() {
document.querySelector('body').innerHTML = document.querySelector('body').innerHTML + 'A got from B: ' + b.getSomething() + '<br />';
},
getSomething: function() {
return 'FROM A';
}
};
module.exports = new A();
},{"./class-b":3}],3:[function(require,module,exports){
var a = require('./class-a');
var B = function() {};
B.prototype = {
printSomething: function() {
document.querySelector('body').innerHTML = document.querySelector('body').innerHTML + 'B got from A: ' + a.getSomething() + '<br />';
},
getSomething: function() {
return 'FROM B';
}
};
module.exports = new B();
},{"./class-a":2}]},{},[1]);
我知道RefluxJS数据存储是这样工作的。操作可以从商店外调用,也可以从一个商店调用到另一个商店。但是,您必须同时创建一个操作模块和一个存储模块。是否需要某种类似的结构,或者是否可以像上面描述的那样每个单体一个模块?感谢示例代码。
因此,在您的情况下,Foo是在Bar之前加载的,因此Bar在加载时可以使用Foo,但Foo在加载时不能使用Bar。
我通常所做的是创建一个init函数(Foo.init,Bar.init(,并在加载完所有资源后调用所有init函数。在您的示例代码中,这是不需要的,因为您在导出中定义的函数可以包含对尚未加载的资源的引用:只要函数在加载完成之前没有执行。
相关文章:
- FRP 中 EventStreams 的循环依赖关系
- GraphQL代码中的Javascript循环依赖关系
- 通过JavaScript构造函数引入循环依赖关系
- RequireJS,循环依赖和导出“魔术”方法
- 使用 requireJs 的模块中的循环依赖关系
- CommonJS singelton模块中的循环依赖关系
- 如何避免 Google 闭包库/编译器中的循环依赖错误
- 如何处理 React 嵌套组件循环依赖?(使用 es6 类)
- AngularJS中的循环依赖和OOP问题
- 如何正确解决需求中的循环依赖.js
- 角度相互依赖的服务:避免循环依赖
- 在拦截器中使用“$mdToast”触发循环依赖
- 视图模型内存泄漏 - 摆脱循环依赖
- 如何在没有循环依赖的模型之间正确共享Hapi-Joi验证模式
- 如何在Backbone.js中使用嵌套视图解决循环依赖关系
- 处理循环依赖
- Javascript循环依赖
- 在单独的文件中考虑模型:如何处理循环/循环依赖关系
- 通过Node.js require和CoffeeScript中的类解决循环依赖
- Angular-使用ngNotificationsBar时发现循环依赖关系