我正在一个将公开3种方法的库中工作。所有这三种方法都依赖于已加载的另一个库(我们称其为libA
),并且该库是异步加载的。
我可以编写代码以在JS文件完成加载后立即公开方法,但随后用户将不得不推迟执行,直到libA
完成。
我希望能在libA
继续在后台异步加载的同时立即公开这3种方法的“版本”。对这3个方法的任何调用都将排队,直到libA
完成加载为止。在libA
完成加载后,这3种方法将被替换为真正的一种,并且将处理队列。
假设我有这个:
var myLib = (function(){
// expose 3 functions for the user to use
return {
"func1" : function(opts){},
"func2" : function(opts){},
"func3" : function(opts){}
}
})();
该库将由用户加载。同时,还将加载
libA
。可能需要更长的时间才能加载到矿井中,或者可能在矿井开始之前完成。因此,如果用户运行
myLib.func1({})
并且libA
尚未完成加载,则应将其排队,然后在libA
完成后应执行。另一方面,如果libA
已完成加载,则它将立即执行。我最初的想法是做这样的事情:
var myLib = (function(){
// queue the calls
var queue {
"func1" : [],
"func2" : [],
"func3" : []
};
// the "temp" functions that just add them to the queue
var ret = {
"func1" : function(opts){ queue.func1.push(opts); },
"func2" : function(opts){ queue.func2.push(opts); },
"func3" : function(opts){ queue.func3.push(opts); }
}
// this may happen before the user users my library or after
// if it happens before then the functions will be replaced before the user calls them and they won't need to be queued
// if it happens after then the functions will get replaced and the queued up ones will be executed
waitForLibAToFinish(function(){
ret.funct1 = function(opts){alert("this is the real func1");},
ret.funct2 = function(opts){alert("this is the real func2");},
ret.funct3 = function(opts){alert("this is the real func3");},
// process the queue
for(var i = 0; i < queue.func1.length; ++i)
{
ret.func1(queue.func1[i]);
}
// repeat for func2 and func3 queue
});
return ret;
})();
但这似乎是一种不好的方法。另外,我必须为每个函数排队,并分别调用每个函数。必须有一种方法可以抽象出该部分,以便对我的库公开的所有方法都具有更通用的意义。
我愿意接受任何想法/建议。我只是不能(出于多种原因无法控制)使用Promise或JavaScript之类的任何第三方库。而且,我的代码必须可以在IE8上运行。相信我,我比你更讨厌它。
===
我要添加更多上下文/细节。
我知道我提到了SharePoint,但这不是SP特定的问题。
我正在建立一个提供便利方法的库,以简化SharePoint中原本很复杂的任务。我的库只不过是调用SP库。相关的SP库是异步加载的。因此,需要发生以下两件事之一:
在调用我的库中的任何方法之前,用户都需要等待相关的SP库完成加载
或者我的库需要等待相关的SP库完成
SP提供的功能允许您“排队”您的功能,直到加载了相关的SP库为止。
我的图书馆目前是建立在第一个选项上的。我想为用户简化体验,以便他们不必检查(通过
ExecuteOrDelayUntillScriptLoaded
的方式)。我可以将其更改为第二种方式,但是有一些我不想这么做的原因。相反,我希望做的是在库中包含1个使用
ExecuteOrDelayUntillScriptLoaded
的检查,这将“修改”我的库的工作。在相关库完成加载之前,我的库只会使调用排队。完成加载并触发ExecuteOrDelayUntillScriptLoaded
之后,我的代码将:执行队列中的所有内容
修改我的库公开的每个函数以直接执行而不是排队
最佳答案
不要自己排队。将库加载和依赖项解析留给用户。只需公开一个实例化您的库的函数,用户就可以在库A准备就绪时调用它,并返回具有可用方法的模块。
甚至已经有一个关于如何执行此操作的标准:Asynchronous Module Definition。 (您不需要require.js作为第三方库,可以自己实现基本要点)
如果用户希望(需要)在加载所有内容之前调用您的库方法,则他们总是可以自己以所需的任何方式将过早的调用排队。但是通常这不是必须的。
关于javascript - 在没有Promise或任何JS库的情况下推迟执行函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42967203/