当我将LoadTask2作为回调传递时,在读取文本文件之前,我正在执行LoadTask2。可能是什么原因?读取文本文件后如何使LoadTask2执行?
LoadTask1(LoadTask2);
function LoadTask1(LoadTask2) {
let parEtask1Pending = document.getElementById('task1Status');
parEtask1.replaceChild(loadingE, parEtask1Pending);
currentIntervalId = setInterval(function() {
readTextFile("file1.txt", getTextData);
}, 2000);
LoadTask2();
}
function LoadTask2() {
console.log("Task2")
}
function readTextFile(file, callback) {
console.log('Reading file..')
var rawFile = new XMLHttpRequest();
rawFile.open("GET", "textFiles/" + file, true);
rawFile.onload = function() {
if (this.status === 200) {
getTextData(this.responseText);
}
}
rawFile.send();
}
输出如下:Task2->正在读取文件。
答案 0 :(得分:1)
问题在这里:
next
javascript不会等待function LoadTask1(LoadTask2) {
let parEtask1Pending = document.getElementById('task1Status');
parEtask1.replaceChild(loadingE, parEtask1Pending);
currentIntervalId = setInterval(function() {
readTextFile("file1.txt", getTextData);
}, 2000);
LoadTask2();
}
完成。 setInterval
被执行并开始“并行”运行。
可能的解决方案是像这样在您的setInterval
中添加一个承诺:
readTextFile
现在您可以在函数上放一个 readTextFile = function(file) {
return new Promise(function(resolve, reject){
console.log('Reading file..')
var rawFile = new XMLHttpRequest();
rawFile.open("GET", "textFiles/" + file, true);
rawFile.onload = function() {
if (rawFile.status === 200) {
resolve(rawFile.responseText);
}
rawFile.send();
}
}
:
.then()
还有另一种使用function LoadTask1(LoadTask2) {
let parEtask1Pending = document.getElementById('task1Status');
parEtask1.replaceChild(loadingE, parEtask1Pending);
readTextFile("file1.txt").then(function(response){
console.log("your response: " + response);
LoadTask2();
})
}
的现代解决方案。您也可以这样做:
async/await
这应该工作,我还没有测试。
此功能中还有一件事:
async function LoadTask1(LoadTask2) {
let parEtask1Pending = document.getElementById('task1Status');
parEtask1.replaceChild(loadingE, parEtask1Pending);
const responseText = await readTextFile("file1.txt");
console.log(responseText);
LoadTask2();
}
实际上,您什么也没有传递回回调函数。您应该将function readTextFile(file, callback) {
console.log('Reading file..')
var rawFile = new XMLHttpRequest();
rawFile.open("GET", "textFiles/" + file, true);
rawFile.onload = function() {
if (this.status === 200) {
getTextData(this.responseText);
}
}
rawFile.send();
}
重命名为getTextData(this.responseText)
,然后在回调函数中执行如下的task2:
callback(this.responseText)
答案 1 :(得分:-1)
那是因为它是由于setInterval函数引起的,它将在执行您的函数之前延迟2秒钟。