我在这里有此while循环:
raw_data={'Class':['A1','B1','C1','D1','A1'],
'Name':['Harry','Christabel','Mel','Chris','Cherry'],
'Color':['Red','Blue','Pink','Red','Red']}
df = pd.DataFrame(raw_data)
all_names = df['Name'][df['Class']=='A1'].unique()
all_colour=df.loc[df['Colour'].isin(all_names)]
通过AJAX函数调用此循环。该计划是等到客户付款为止。为了对此进行检查,我构建了一个$payment_timeout = time() + 300;
while ( time() < $payment_timeout ) {
if (is_valid()) {
continue;
}
break;
}
函数,该函数对数据库进行检查以检查是否已付款。
问题在于,在这种情况下,由于请求数量过多,我的数据库将崩溃。因此,我正在寻找一种方法,每隔is_valid()
次执行检查,而其他时候只需执行继续操作即可。
有没有办法做到这一点?
答案 0 :(得分:1)
您可以使用javascript进行“长时间轮询”。
这非常简单:每隔X秒运行一次javascript函数(在您的情况下为10秒),并调用服务器。
通过这篇帖子Using setInterval() to do simplistic continuous polling,您可以执行以下操作:
// This function is called every 10000 milliseconds (10 seconds)
function refresh() {
// make Ajax call here, inside the callback call:
// call itself again after 10 seconds
setTimeout(refresh, 10000);
}
// if you want to wait 10 seconds for the first call
setTimeout(refresh, 10000);
// or if you want to call immediately the first time
refresh();
如果要在5分钟后停止通话,只需设置一个计数器变量并在刷新功能中检查它即可。
类似于(伪代码):
IF YOUR_COUNTER < 5 MINUTES THEN
CALL REFRESH AGAIN
refresh
函数的结尾。
答案 1 :(得分:1)
以下是Java中轮询机制的简单通用实现,可处理可变的端点,时间间隔,持续时间和回调。
假设是您从PHP代码中删除了while循环,并确保发送回有效的JSON响应。在下面给出的回调参数中,假设是PHP发送回
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2'
classpath 'com.google.gms:google-services:4.2.0'
}
}
allprojects {
repositories {
google()
jcenter()
maven { url "https://giphy.bintray.com/giphy-sdk" }
maven { url "https://maven.google.com" }
maven { url 'https://jitpack.io' }
maven { url 'https://jcenter.bintray.com/' }
maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local'}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
。
json_encode(['paid' => true])
NB:XHR = XMLHttpRequest; @Giacomo显示的不是长轮询,long-polling是一种客户端-服务器技术,涉及保持连接请求打开。
答案 2 :(得分:0)
我现在正在使用setInterval()函数进行检查:
let interval = setInterval( function () {
//If max time of 5 minutes exceeded (5 * 60000) I leave the interval
if ( new Date().getTime() - startTime > 300000 ) {
clearInterval( interval );
}
//Here I'm doing my AJAX request to check the payment status
}, 5000 ); //<- Execute every 5 seconds
这对我来说很好,很简单