gpt4 book ai didi

javascript - CommonJS 单例模块中的循环依赖

转载 作者:太空宇宙 更新时间:2023-11-03 22:36:18 30 4
gpt4 key购买 nike

我想知道以下是否以及如何可能:

CommonJS 环境,在 Node 和/或浏览器中使用的模块(带有 Browserify )。

两个(或更多)模块,每个返回一个单例,需要在应用程序的不同部分/模块中可用。它们还应该能够相互调用,因此存在循环依赖情况。我知道可以使用某种依赖注入(inject),但我想避免一种代码结构,在从另一个单例调用其中一个单例上的方法时,我需要调用类似 this.dependency.ModuleName 的代码结构那些。我希望能够直接在 require 语句返回的对象上调用方法。

我意识到这不可能通过两个导出实例化单例对象的 CommonJS 模块直接实现(因为循环依赖)。所以我希望能够使用通用代码来包装它,发挥一些魔力。像这样的东西:

var Magic = require('./magic');

module.exports = Magic.createSingelton({
// ...
});

由于循环依赖而失败的 Browserify 示例:

(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 函数。在您的示例代码中,这是不需要的,因为您在导出中定义的函数允许包含对尚未加载的资源的引用:只要在加载完成之前不执行这些函数即可。

关于javascript - CommonJS 单例模块中的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28042590/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com