Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中对来自用户事件的AJAX请求进行排队_Javascript_Ajax_Async Await - Fatal编程技术网

在Javascript中对来自用户事件的AJAX请求进行排队

在Javascript中对来自用户事件的AJAX请求进行排队,javascript,ajax,async-await,Javascript,Ajax,Async Await,我正在制作一个Javascript页面,请求有关用户事件的数据 每个事件都需要检索大量数据,所以我通过一个AJAX请求获得少量数据,以便显示更新。回调通过AJAX递归地请求更多的数据,直到没有数据可供获取为止。在这条链条中,一切都进展顺利 但是,当用户在另一个链已经运行时触发更多事件时,就会出现问题。两条链使用相同的数据对象,因此数据会丢失。对这些用户事件进行排队的正确方式是什么,这样它们就不会同时运行?我添加了一个互斥体,但没有考虑AJAX请求 一般代码结构: 函数userEvent{ 排他性

我正在制作一个Javascript页面,请求有关用户事件的数据

每个事件都需要检索大量数据,所以我通过一个AJAX请求获得少量数据,以便显示更新。回调通过AJAX递归地请求更多的数据,直到没有数据可供获取为止。在这条链条中,一切都进展顺利

但是,当用户在另一个链已经运行时触发更多事件时,就会出现问题。两条链使用相同的数据对象,因此数据会丢失。对这些用户事件进行排队的正确方式是什么,这样它们就不会同时运行?我添加了一个互斥体,但没有考虑AJAX请求

一般代码结构:

函数userEvent{ 排他性数据 } var dataCache=[]; var getDataMutex=new MutexPromise'thisisanuiqueneoughkey'; 函数独占性EGETDATA{ 返回getDataMutex.promise .Then函数{ getDataMutex.lock; 获取数据; } .Then函数{ getDataMutex.unlock; 返回res; } 凯西先生{ getDataMutex.unlock; 投掷e; }; } 函数getData{ $.geturl,functiondata{ dataCache.handleData; ifthereIsMoreData 获取数据; } }
这当然不起作用,因为在释放锁之前,我们不会等待$.get完成。我很确定我需要承诺,但我已经花了大约4个小时摆弄这些承诺,但我还没有让它发挥作用。有什么建议吗?

您可以尝试使用简单的计数检查次数,用户触发事件,pendingAjaxCount将存储用户事件触发器,根据每个触发器的完成情况,这将有助于减少计数并触发下一个ajax调用

var PendingaxCount=0; var dataCache=[]; var userEvent==>{ pendingaxcount++; IfPendingJaxCount==1{ 获取数据; } } var unlockedData==>{ IfPendingJaxCount!==0{ 获取数据; } }; var getData==>{ $.geturl,functiondata{ dataCache.handleData; ifthereIsMoreData{ 获取数据; } 否则{ Pendingax计数-; 解锁数据 } }
} 您可以尝试使用简单的计数检查次数,用户触发事件,pendingAjaxCount将存储用户事件触发器,根据每个触发器的完成情况,这将有助于减少计数并触发下一个ajax调用

var PendingaxCount=0; var dataCache=[]; var userEvent==>{ pendingaxcount++; IfPendingJaxCount==1{ 获取数据; } } var unlockedData==>{ IfPendingJaxCount!==0{ 获取数据; } }; var getData==>{ $.geturl,functiondata{ dataCache.handleData; ifthereIsMoreData{ 获取数据; } 否则{ Pendingax计数-; 解锁数据 } }
} 触发事件时,在列表中添加要发出的请求,并通过检查布尔标志变量(最初为true)是否为true来检查是否可以发出请求。如果可以发出请求,请将boolean flag变量设置为false,然后继续执行请求,否则不需要执行任何操作

请求完成后,检查列表中是否有任何挂起的请求,如果有,则逐个发出这些请求。如果没有挂起的请求,则将布尔标志变量设置为true,表示所有挂起的请求都已完成

例子: 请参阅下面的示例,该示例从chuck norris笑话api获取随机笑话。第一次单击fetch按钮时,会在2秒后发出第一个请求。如果在发出第一个请求之前多次按下该按钮,所有这些请求都将添加到pendingRequests数组中,并且在第一个请求完成后,如果有任何未决请求,则将发出下一个请求

添加p.S.setTimeout只是为了显示当多次单击按钮时,请求会添加到pendingRequests数组中。如果遵循此示例,则可以在代码中删除该选项

const btn=document.querySelector'button'; 常量baseURL=https://api.chucknorris.io/jokes/random'; 常量pendingRequests=[]; 让canMakeRequest=true; btn.addEventListener'click',获取数据; 函数getData{ pendingRequests.pushbaseURL; 如果你能提出请求{ canMakeRequest=false; 设置超时=>{ makeRequestpendingRequests.shift; }, 2000; } } 函数makeRequesturl{ 获取URL .thenres=>res.json .thendata=>{ 显示数据[数据]; const nextURL=pendingRequests.shift; 如果下一个{ makerequestnextur; } 否则{ canMakeRequest=true; } } .catcherror=>console.logerror; } 函数displayDatadata{ const div=document.querySelector'div'; 设html=; data.forEachd=>html+=`${d.value}`; di v、 innerHTML+=html; } div{ 显示器:flex; 弯曲方向:立柱; 对齐项目:居中; } 跨度{ 背景:F8; 盒影:0.02×rgba0,0,0,0.2; 填充:15px; 保证金:5px; 宽度:100%; 文本对齐:居中; } 获取数据
触发事件时,在列表中添加要发出的请求,并通过检查布尔标志变量(最初为true)是否为true来检查是否可以发出请求。如果可以发出请求,请将boolean flag变量设置为false,然后继续执行请求,否则不需要执行任何操作

请求完成后,检查列表中是否有任何挂起的请求,如果有,则逐个发出这些请求。如果没有挂起的请求,则将布尔标志变量设置为true,表示所有挂起的请求都已完成

例子: 请参阅下面的示例,该示例从chuck norris笑话api获取随机笑话。第一次单击fetch按钮时,会在2秒后发出第一个请求。如果在发出第一个请求之前多次按下该按钮,所有这些请求都将添加到pendingRequests数组中,并且在第一个请求完成后,如果有任何未决请求,则将发出下一个请求

添加p.S.setTimeout只是为了显示当多次单击按钮时,请求会添加到pendingRequests数组中。如果遵循此示例,则可以在代码中删除该选项

const btn=document.querySelector'button'; 常量baseURL=https://api.chucknorris.io/jokes/random'; 常量pendingRequests=[]; 让canMakeRequest=true; btn.addEventListener'click',获取数据; 函数getData{ pendingRequests.pushbaseURL; 如果你能提出请求{ canMakeRequest=false; 设置超时=>{ makeRequestpendingRequests.shift; }, 2000; } } 函数makeRequesturl{ 获取URL .thenres=>res.json .thendata=>{ 显示数据[数据]; const nextURL=pendingRequests.shift; 如果下一个{ makerequestnextur; } 否则{ canMakeRequest=true; } } .catcherror=>console.logerror; } 函数displayDatadata{ const div=document.querySelector'div'; 设html=; data.forEachd=>html+=`${d.value}`; div.innerHTML+=html; } div{ 显示器:flex; 弯曲方向:立柱; 对齐项目:居中; } 跨度{ 背景:F8; 盒影:0.02×rgba0,0,0,0.2; 填充:15px; 保证金:5px; 宽度:100%; 文本对齐:居中; } 获取数据
重复的如果你想使用AJAX而不是承诺,也许你可以暂停用户发送新数据的能力,比如更改按钮以重新加载图标,直到你得到响应,然后更改回按钮,在这种情况下,您将不会从中间用户获得任何新事件。NVM链接中的解决方案锁定整个页面。duration@Bizzaros响应能力很重要,因此这不是一个选项。明天,我将尝试在触发新用户事件时中止所有正在运行的请求。不漂亮,但应该更易于实现。对这些用户事件进行排队的正确方式是什么?对用户事件进行排队的正确方式是对用户事件进行排队-将它们添加到工作队列中,而不是像Yousaf在回答中所做的那样立即对其采取行动。如果要使用AJAX而不是承诺,请复制,也许你可以暂停用户的能力来发送新的数据,如改变按钮,重新加载图标,直到你得到响应,然后换回到按钮,在这种情况下,你不会得到任何新的事件,从用户在中间。NVM的解决方案中的链接锁定整个页面的duration@Bizzaros响应能力很重要,因此这不是一个选项。明天,我将尝试在触发新用户事件时中止所有正在运行的请求。不漂亮,但应该更易于实现。将这些用户事件排队的正确方式是什么?将用户事件排队的正确方式是将用户事件排队。将它们添加到工作队列中,而不是像Yousaf在回答中所做的那样立即对其采取行动。