如何处理循环依赖? [重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理循环依赖? [重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
鉴于:
StringPreconditions
延伸ObjectPreconditions
ObjectPreconditions
依赖于StringPreconditions
(其中一个方法返回子类)Preconditions
是ObjectPreconditions
和StringPreconditions
的守门人(确保他们在返回实例之前加载)User
依赖于Preconditions
我有这个代码:
define(["ObjectPreconditions"], function(ObjectPreconditions)
{
console.log("Inside StringPreconditions");
function StringPreconditions() {}
StringPreconditions.prototype = Object.create(ObjectPreconditions.prototype);
StringPreconditions.prototype.constructor = ObjectPreconditions;
return StringPreconditions;
});
define(["require"], function(require)
{
console.log("Inside ObjectPreconditions");
// Resolve circular dependencies
var StringPreconditions;
require(["StringPreconditions"], function(theStringPreconditions)
{
StringPreconditions = theStringPreconditions;
console.log("ObjectPreconditions finished loading StringPreconditions");
});
function ObjectPreconditions() {}
ObjectPreconditions.prototype.isInstanceOf(type)
{
console.log("ObjectPreconditions.isInstanceOf() invoked");
if (type === String)
return new StringPreconditions();
}
});
define(["ObjectPreconditions", "StringPreconditions"], function(ObjectPreconditions, StringPreconditions)
{
console.log("Inside Preconditions");
var Preconditions = {};
Preconditions.requireThat(parameter) = function()
{
return new ObjectPreconditions(parameter);
};
return Preconditions;
});
define(["Preconditions"], function(Preconditions)
{
console.log("Inside User");
function User() {}
User.prototype.doSomething = function()
{
var StringPrecondition = Preconditions.requireThat("test").isInstanceOf(String);
}
});
问题是我有10%的时间得到这个加载顺序:
- 内部用户
- 内部先决条件
- 内部ObjectPreconditions
- 在StringPreconditions中
- ObjectPreconditions.isInstanceOf()(CRASH,因为未定义StringPreconditions)
- ObjectPreconditions完成加载StringPreconditions
我已经阅读过http://requirejs.org/docs/api.html#circular,但我相信他们正在做同样的事情。
有任何想法吗?
答案
更新:https://stackoverflow.com/a/42264822/14731包含ES6模块的更新答案。
我想通了:我们需要创建一个“关守”文件,它将定义依赖于循环依赖关系的函数。
- 将
ObjectPreconditions.js
重命名为AbstractObjectPreconditions.js
。 - 创建一个新的
ObjectPreconditions.js
文件(我们的新网守)。 - 将任何循环依赖项从
AbstractObjectPreconditions.js
移到ObjectPreconditions.js
- 用户代码应该是
require(ObjectPreconditions)
。循环依赖中涉及的代码(例如子类)应该是require(AbstractObjectPreconditions)
。
以下是生成的代码:
define(["AbstractObjectPreconditions"], function(ObjectPreconditions)
{
console.log("Inside StringPreconditions");
function StringPreconditions() {}
StringPreconditions.prototype = Object.create(ObjectPreconditions.prototype);
StringPreconditions.prototype.constructor = ObjectPreconditions;
return StringPreconditions;
});
define(["require"], function(require)
{
console.log("Inside AbstractObjectPreconditions");
function ObjectPreconditions() {}
return ObjectPreconditions;
});
define(["AbstractObjectPreconditions"], function(ObjectPreconditions)
{
// Gatekeeper for circular dependencies
ObjectPreconditions.prototype.isInstanceOf(type)
{
console.log("ObjectPreconditions.isInstanceOf() invoked");
if (type === String)
return new StringPreconditions();
}
return ObjectPreconditions;
});
define(["ObjectPreconditions", "StringPreconditions"], function(ObjectPreconditions, StringPreconditions)
{
console.log("Inside Preconditions");
var Preconditions = {};
Preconditions.requireThat(parameter) = function()
{
return new ObjectPreconditions(parameter);
};
return Preconditions;
});
define(["Preconditions"], function(Preconditions)
{
console.log("Inside User code");
function User() {}
User.prototype.doSomething = function()
{
var StringPrecondition = Preconditions.requireThat("test").isInstanceOf(String);
}
});
以上是关于如何处理循环依赖? [重复]的主要内容,如果未能解决你的问题,请参考以下文章