Javascript: 如何防止下一行执行到SetInterval循环已经clearinterval?
Javascript: How to prevent the next line executed until SetInterval loop has been clearinterval?
最近我在做一个使用 SetInterval 和 SetTimeout 的项目
这是简单的代码:
(注:functionB,functionC 与 jquery ajax 请求相关)
function functionB() {
jQuery.ajax({
type: 'POST',
url: 'https://MYHOSTNAME',
headers: {
'Content-Type': 'XXX',
'Accept': 'XXX'
},
data: MYDATA,
dataType: 'html',
success: function (data, status, xhr) {
var RESPONSEDATA = data;
//true if match my special string
var Compare = RESPONSEDATA.indexOf(MYSTRING) > -1;
if (Compare === true){
//stop the loop
clearInterval(loop1);
}
}
});
}
function Main(){
functionA();//can be anything
var loop1 = setInterval(function () {
setTimeout(functionB, 1000);
setTimeout(functionC, 1000);
}, 3000);
functionD();//can be anything
setTimeout(Main, 16000);
}
main();
我正在尝试确保 functionD 仅在 loop1 以 clearInterval 结束后才执行,当 functionB 和 functionC 仍在循环中时无法执行,只有在执行 functionD 时,函数 Main 才会等待 16000 毫秒,然后重新启动。
我用 setInterval 和 setTimeout 尝试了很多方法,但没有成功。
任何 javascript 专家都知道如何做到这一点?
当你想要这个:
- 运行宁函数A()
- 运行每 4 秒并行执行一次 functionB() 和 functionC()
- 当停止时 运行调用 functionB() 和 functionC() 然后 运行 functionD 一次
- 当 functionD 完成时 运行 Main() 延迟 16 秒
为循环添加一个存活检查
var loop1;
function functionB() {
jQuery.ajax({
type: 'POST',
url: 'https://MYHOSTNAME',
headers: {
'Content-Type': 'XXX',
'Accept': 'XXX'
},
data: MYDATA,
dataType: 'html',
success: function (data, status, xhr) {
var RESPONSEDATA = data;
//true if match my special string
var Compare = RESPONSEDATA.indexOf(MYSTRING) > -1;
if (Compare === true){
//stop the loop
clearInterval(loop1);
loop1 = false;
}
}
});
}
function aliveCheckOfLoop(){
if(loop1){
addTimeout(aliveCheckOfLoop, 500);
}else{
functionD();//can be anything
setTimeout(Main, 16000);
}
}
function Main(){
functionA();//can be anything
loop1 = setInterval(function () {
setTimeout(functionB, 1000);
setTimeout(functionC, 1000);
}, 3000);
aliveCheckOfLoop();
}
main();
另一种方法是将主函数拆分为多个部分,并在清除循环后调用第二部分。
var loop1;
function functionB() {
jQuery.ajax({
type: 'POST',
url: 'https://MYHOSTNAME',
headers: {
'Content-Type': 'XXX',
'Accept': 'XXX'
},
data: MYDATA,
dataType: 'html',
success: function (data, status, xhr) {
var RESPONSEDATA = data;
//true if match my special string
var Compare = RESPONSEDATA.indexOf(MYSTRING) > -1;
if (Compare === true){
//stop the loop
clearInterval(loop1);
goOn();
}
}
});
}
function goOn(){
functionD();//can be anything
setTimeout(Main, 16000);
}
function Main(){
functionA();//can be anything
loop1 = setInterval(function () {
setTimeout(functionB, 1000);
setTimeout(functionC, 1000);
}, 3000);
}
main();
最近我在做一个使用 SetInterval 和 SetTimeout 的项目
这是简单的代码: (注:functionB,functionC 与 jquery ajax 请求相关)
function functionB() {
jQuery.ajax({
type: 'POST',
url: 'https://MYHOSTNAME',
headers: {
'Content-Type': 'XXX',
'Accept': 'XXX'
},
data: MYDATA,
dataType: 'html',
success: function (data, status, xhr) {
var RESPONSEDATA = data;
//true if match my special string
var Compare = RESPONSEDATA.indexOf(MYSTRING) > -1;
if (Compare === true){
//stop the loop
clearInterval(loop1);
}
}
});
}
function Main(){
functionA();//can be anything
var loop1 = setInterval(function () {
setTimeout(functionB, 1000);
setTimeout(functionC, 1000);
}, 3000);
functionD();//can be anything
setTimeout(Main, 16000);
}
main();
我正在尝试确保 functionD 仅在 loop1 以 clearInterval 结束后才执行,当 functionB 和 functionC 仍在循环中时无法执行,只有在执行 functionD 时,函数 Main 才会等待 16000 毫秒,然后重新启动。
我用 setInterval 和 setTimeout 尝试了很多方法,但没有成功。 任何 javascript 专家都知道如何做到这一点?
当你想要这个:
- 运行宁函数A()
- 运行每 4 秒并行执行一次 functionB() 和 functionC()
- 当停止时 运行调用 functionB() 和 functionC() 然后 运行 functionD 一次
- 当 functionD 完成时 运行 Main() 延迟 16 秒
为循环添加一个存活检查
var loop1;
function functionB() {
jQuery.ajax({
type: 'POST',
url: 'https://MYHOSTNAME',
headers: {
'Content-Type': 'XXX',
'Accept': 'XXX'
},
data: MYDATA,
dataType: 'html',
success: function (data, status, xhr) {
var RESPONSEDATA = data;
//true if match my special string
var Compare = RESPONSEDATA.indexOf(MYSTRING) > -1;
if (Compare === true){
//stop the loop
clearInterval(loop1);
loop1 = false;
}
}
});
}
function aliveCheckOfLoop(){
if(loop1){
addTimeout(aliveCheckOfLoop, 500);
}else{
functionD();//can be anything
setTimeout(Main, 16000);
}
}
function Main(){
functionA();//can be anything
loop1 = setInterval(function () {
setTimeout(functionB, 1000);
setTimeout(functionC, 1000);
}, 3000);
aliveCheckOfLoop();
}
main();
另一种方法是将主函数拆分为多个部分,并在清除循环后调用第二部分。
var loop1;
function functionB() {
jQuery.ajax({
type: 'POST',
url: 'https://MYHOSTNAME',
headers: {
'Content-Type': 'XXX',
'Accept': 'XXX'
},
data: MYDATA,
dataType: 'html',
success: function (data, status, xhr) {
var RESPONSEDATA = data;
//true if match my special string
var Compare = RESPONSEDATA.indexOf(MYSTRING) > -1;
if (Compare === true){
//stop the loop
clearInterval(loop1);
goOn();
}
}
});
}
function goOn(){
functionD();//can be anything
setTimeout(Main, 16000);
}
function Main(){
functionA();//can be anything
loop1 = setInterval(function () {
setTimeout(functionB, 1000);
setTimeout(functionC, 1000);
}, 3000);
}
main();