我要检查一个文本文件(如果其中包含该文本),然后转到下一个get请求并检查另一个文本文件,以查看第二个文本文件是否包含某些文本。
我尝试过将其放入while循环中:
function testMessage()
{
const filePaths =
[
"http://example.com/trigger.txt",
"http://example.com/userexceptions.txt",
"http://example.com/message.txt"
];
const trigger = "true";
var currentStage = 0;
const finalStage = 2;
var breakLoop = false;
while (currentStage < finalStage)
{
$.get(filePaths[currentStage], function(data)
{
if (currentStage == 0)
{
const compareText = data.localeCompare(trigger, "en", {sensitivity: "base"});
if (compareText == 0) //if the first text file contains the trigger "true", continue
{
someGlobalVariable = true;
currentStage++;
} else {
breakLoop = true;
}
} else if (currentStage == 1) //if the second text file contains the username of the current user, break the loop
{
const rawUsers = data;
const userExceptions = rawUsers.split(';');
if (userExceptions.indexOf(currentUser) > -1)
{
console.log("User exception is: " + userExceptions[userExceptions.indexOf(currentUser)]);
breakLoop = true;
} else {
currentStage++;
}
} else if (currentStage == 2)
{
globalNotification = data;
notification.global(globalNotification);
console.log("Global notification displayed.");
} else {
console.log("We're here now.");
}
}, 'text')
.fail(function()
{
console.log("Global notifications failed at stage: " + currentStage);
});
if (breakLoop)
break;
}
}
我也尝试使用switch语句代替多个if-else语句,并且导致页面中断,因此我认为它没有正确地退出switch和循环。
运行此命令时,似乎循环永远不会结束,因此会中断页面?
答案 0 :(得分:0)
我将以非常不同的方式实现这一目标。我认为您应该阅读fetch
和promises
(https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)。这样可以轻松解决此类问题!
无论如何...我试图对您的代码进行最小的改动以使其正常工作。方法如下:
test
方法。breakLoop
var被test
方法return代替。breakLoop
测试替换为递归测试。getFiles
方法所代替。这也使testMessage
也异步,所以我给它添加了一个callback
参数。getFiles
在索引0声明后被调用。
**它使用jQuery的ajax,并在结果上运行当前阶段测试。
**当返回true而不是最后一项时,它将调用getFiles
进入下一阶段。
**所以...这意味着它不是并行的。 (我相信)它是顺序的。 function testMessage(callback)
{
const trigger = "true";
const files =
[
{
url: "http://example.com/trigger.txt",
test(data) {
const compareText = data.localeCompare(trigger, "en", {sensitivity: "base"});
if (compareText == 0) //if the first text file contains the trigger "true", continue
{
someGlobalVariable = true;
return true;
}
else return false;
}
},
{
url: "http://example.com/userexceptions.txt",
test(data) {
const rawUsers = data;
const userExceptions = rawUsers.split(';');
if (userExceptions.indexOf(currentUser) > -1)
{
console.log("User exception is: " + userExceptions[userExceptions.indexOf(currentUser)]);
return false;
}
return true;
}
},
{
url: "http://example.com/message.txt",
test(data) {
globalNotification = data;
notification.global(globalNotification);
console.log("Global notification displayed.");
return true;
}
}
];
(function getFiles(currentStage)
{
$.get(files[currentStage].url, function(data)
{
if (files[currentStage].test(data))
{
if (files.length > currentStage+1) getFiles(currentStage+1)
else callback(null, "Success!")
}
else callback(Error(`Stage${currentStage}'s test fail.`, null))
}, 'text')
.fail(function()
{
console.log("Global notifications failed at stage: " + currentStage);
});
})(0);
}
testMessage(console.log)