You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
release: function () {
var hasFetching= false;
var uri, mod;
for ( var uri in cache ) {
mod = cache[uri];
if ( mod.status == STATUS.FETCHING ) {
hasFetching = true;
break;
}
}
if ( !hasFetching ) {
for ( uri in cache ) {
mod = cache[uri];
if ( mod.status == STATUS.LOADING ) {
mod.onload();
}
}
}
}
优化一下,可以维护一个fetching模块计数器,和一个处于LOADING状态的模块列表;
var fetchingCount = 0;
var loadingModules = {};
release方法:
release: function () {
if ( fetchingCount > 0 ) {
return;
}
var uri, mod;
for ( uri in loadingModules ) {
mod = loadingModules[uri];
if ( mod.status == STATUS.LOADING ) {
mod.onload();
}
}
loadingModules = {};
}
简化场景:模块a依赖模块b,同时模块b依赖模块a, a要等b ready后才能进入ready状态,b要等a ready后才能进入ready状态,如果没有循环探测,a和b会永久的相互等待,即静默失败。
循环依赖的路径可能非常长而且复杂。通常思路就是在一个图结构中寻找环,然后将环打开,使用递归的话会引起回溯,性能会受影响。在实现mb时递归遍历树,当有回溯产生时,执行时间对于页面响应来说是不能忍受的,所以这不是一个好的方法。
思路如下:
现在的模块有如下状态:
循环依赖造成静默失败时,a, b所处的状态是LOADING, 等待依赖。
可以在每个模块进入LOADING状态后,检查是否有模块正在被加载(处于FETCHING状态),如果没有,则可以认为所有模块对应的文件都加载完毕,即define执行完毕。此时遍历模块,如果有模块处于LOADING状态,那么可以认为出现了循环依赖,将其状态置为LOADED。
优化一下,可以维护一个fetching模块计数器,和一个处于LOADING状态的模块列表;
release方法:
一个简单实现 https://github.com/xwcoder/kit
The text was updated successfully, but these errors were encountered: