我从服务器动态加载代码(函数)并将其作为javascript代码执行,然后将其存储在数组中并执行.所有这些代码片段必须只执行一次.伪造的代码如下
function fetch(foo){
if (foo in fooArray){
//Do Nothing
else{
//Fetch foo via Ajax and execute foo()
}
}
Run Code Online (Sandbox Code Playgroud)
问题要复杂得多,但基本上如果我发出以下命令
fetch('someFunctionName');
fetch('someFunctionName');
fetch('someFunctionName');
fetch('someFunctionName');
Run Code Online (Sandbox Code Playgroud)
所有四个都将执行if (foo in fooArray)并假设它不在数组中,并且所有四个将继续获取代码并执行它.我记得当天回来学习信号量和互斥量,是否有javascript这样的东西.
JS中的Prom允许您进行异步编程,如下所示:
DoSomething().then(success, failure);
DoSomethingElse();
Run Code Online (Sandbox Code Playgroud)
每当我写完之前的代码,它就会到达DoSomethingElse()之前success.怎么可能?JS不是单线程环境(不包括Web工作者)吗?它完成了setTimeout吗?
我知道,使用JavaScript和'atomic'这两个词 - 同一个句子中的任何内容都有点奇怪,因为JavaScript被认为是异步的,因此不是非常原子的.
//编辑这是我的错误!通过让警报响起(并在Chrome中隐藏更多警报),它很快就会中断并让其他代码飞起来.JavaScript是单线程的.
快速 - >实际问题; 我们在哪种情况下从异步回调中断中保存,我们如何防止它们出现在某些代码块中?
长 - >我的情景; 我的整个应用程序非常递归并触发了许多ajax请求,返回时会触发更多可能触发更多ajax请求的递归函数.在我的代码中,我在一个数组上有一些非常关键的操作,必须在下一个操作发生之前完成(尽管简单的push/splice逻辑).
我有一个问题,我在一个数组中获得了一个键的索引并将其保存在一个变量中.然后我把它比作-1,如果它是真的,我拼接(不仅仅是取消)数组中的元素.现在,在获取索引和拼接之间,异步回调返回结果并启动递归的东西,然后通过添加/删除更多项来改变数组(并弄乱我之前获得的索引值).
这是旧代码;
if ( this.dataset && (index=this.dataset.children.indexOf(child.key) )!==-1 ){
console.log("removed from dataset!");
//<=== AJAX Call Returns and adds/removes items from the array
this.dataset.children.splice(index, 1); //goes bad, because index not good anymore
...
}
Run Code Online (Sandbox Code Playgroud)
这是'工作',但不是优化的代码
if ( this.dataset && (index=this.dataset.children.indexOf(child.key) )!==-1 ){
console.log("removed from dataset!");
//<=== AJAX Call Returns and adds/removes items from the array
//Problem solved, since I'm getting the index again
this.dataset.children.splice(this.dataset.children.indexOf(child.key), 1);
...
}
Run Code Online (Sandbox Code Playgroud)
我只是再次搜索索引并直接拼接它.
我的一般问题是,我们在哪种情况下从异步回调中断中保存,我们如何防止它们出现在某些代码块中? …