在没有 Promise 或任何 JS 库的情况下延迟函数执行
defer function execution without Promise or any JS library
我正在开发一个将公开 3 种方法的库。所有这三种方法都依赖于另一个已加载的库(我们称之为 libA
)并且该库是异步加载的。
我可以编写代码在 JS 文件完成加载后立即公开方法,但用户将不得不推迟执行直到 libA
完成。
我希望立即公开这 3 个方法中的 "a version",同时 libA
继续在后台异步加载。对这 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;
})();
但这似乎是一种糟糕的方法。另外,我必须为每个函数创建一个队列并调用每个函数。必须有一种方法来抽象该部分,以便它对我的库公开的所有方法更通用。
我对任何 ideas/suggestions 持开放态度。我只是不能(出于我无法控制的众多原因)使用任何第 3 方库,如 Promise 或 JavaScript。而且,我的代码必须在 IE8 上运行。相信我,我比你更讨厌它。
===
我正在添加一些 context/details。
我知道我提到了 SharePoint,但这不是 SP 特定的问题。
我正在构建一个库,它提供了简化 SharePoint 中其他复杂任务的便捷方法。我的图书馆所做的就是调用 SP 图书馆。相关的 SP 库是异步加载的。所以需要发生以下两件事之一:
- 要么用户需要等待相关SP库完成加载,然后才能调用我库中的任何方法
- 或者我的库需要等待相关的SP库完成
SP 提供的函数可以让您 "queue" 在加载相关 SP 库之前启动您的函数 ExecuteOrDelayUntillScriptLoaded
。
我的图书馆目前是建立在第一个选项上的。我想简化用户的体验,这样他们就不必检查(通过 ExecuteOrDelayUntillScriptLoaded
)。我可以将其更改为第二种方式,但有一些我不想这样做的原因。
相反,我希望做的是在我的图书馆中包含 1 个 ExecuteOrDelayUntillScriptLoaded
支票,这将 "modify" 我的图书馆所做的事情。在相关库完成加载之前,我的库只会对调用进行排队。在完成加载并触发 ExecuteOrDelayUntillScriptLoaded
之后,我的代码将:
- 执行队列中的所有内容
- 修改我的库公开的每个函数直接执行而不是排队
不要自己排队。将库加载和依赖项解析留给用户。只需公开一个实例化您的库的函数,用户可以在库 A 准备就绪时调用它,并取回具有可用方法的模块。
甚至已经有一个关于如何做到这一点的标准:Asynchronous Module Definition。 (你不需要require.js作为第三方库,你可以自己实现最基本的)
如果用户想要(需要)在加载所有内容之前调用您的库方法,他们总是可以自己以任何他们想要的方式对过早调用进行排队。但通常这不是必需的。
我正在开发一个将公开 3 种方法的库。所有这三种方法都依赖于另一个已加载的库(我们称之为 libA
)并且该库是异步加载的。
我可以编写代码在 JS 文件完成加载后立即公开方法,但用户将不得不推迟执行直到 libA
完成。
我希望立即公开这 3 个方法中的 "a version",同时 libA
继续在后台异步加载。对这 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;
})();
但这似乎是一种糟糕的方法。另外,我必须为每个函数创建一个队列并调用每个函数。必须有一种方法来抽象该部分,以便它对我的库公开的所有方法更通用。
我对任何 ideas/suggestions 持开放态度。我只是不能(出于我无法控制的众多原因)使用任何第 3 方库,如 Promise 或 JavaScript。而且,我的代码必须在 IE8 上运行。相信我,我比你更讨厌它。
===
我正在添加一些 context/details。
我知道我提到了 SharePoint,但这不是 SP 特定的问题。
我正在构建一个库,它提供了简化 SharePoint 中其他复杂任务的便捷方法。我的图书馆所做的就是调用 SP 图书馆。相关的 SP 库是异步加载的。所以需要发生以下两件事之一:
- 要么用户需要等待相关SP库完成加载,然后才能调用我库中的任何方法
- 或者我的库需要等待相关的SP库完成
SP 提供的函数可以让您 "queue" 在加载相关 SP 库之前启动您的函数 ExecuteOrDelayUntillScriptLoaded
。
我的图书馆目前是建立在第一个选项上的。我想简化用户的体验,这样他们就不必检查(通过 ExecuteOrDelayUntillScriptLoaded
)。我可以将其更改为第二种方式,但有一些我不想这样做的原因。
相反,我希望做的是在我的图书馆中包含 1 个 ExecuteOrDelayUntillScriptLoaded
支票,这将 "modify" 我的图书馆所做的事情。在相关库完成加载之前,我的库只会对调用进行排队。在完成加载并触发 ExecuteOrDelayUntillScriptLoaded
之后,我的代码将:
- 执行队列中的所有内容
- 修改我的库公开的每个函数直接执行而不是排队
不要自己排队。将库加载和依赖项解析留给用户。只需公开一个实例化您的库的函数,用户可以在库 A 准备就绪时调用它,并取回具有可用方法的模块。
甚至已经有一个关于如何做到这一点的标准:Asynchronous Module Definition。 (你不需要require.js作为第三方库,你可以自己实现最基本的)
如果用户想要(需要)在加载所有内容之前调用您的库方法,他们总是可以自己以任何他们想要的方式对过早调用进行排队。但通常这不是必需的。