Javascript 我如何不在if条件下使用setTimeout重复函数?
我有一个函数,基本上从txt文件中获取数据,对其进行解析,并将解析后的数据放入HTML标记中。此功能设置为超时500 如果一个文件中的数据在函数的最后一次迭代后没有改变,我怎么能不将相同的数据放在HTML标记中呢?因为我不想让它做同样的任务417次,哈哈 我尝试过这个方法,但看起来每次函数迭代后变量都会被删除Javascript 我如何不在if条件下使用setTimeout重复函数?,javascript,settimeout,Javascript,Settimeout,我有一个函数,基本上从txt文件中获取数据,对其进行解析,并将解析后的数据放入HTML标记中。此功能设置为超时500 如果一个文件中的数据在函数的最后一次迭代后没有改变,我怎么能不将相同的数据放在HTML标记中呢?因为我不想让它做同样的任务417次,哈哈 我尝试过这个方法,但看起来每次函数迭代后变量都会被删除 函数loadTxt(){ jQuery.get('http://localhost:8000/np/nowPlaying.txt,函数(数据){ var nowPlaying=data.s
函数loadTxt(){
jQuery.get('http://localhost:8000/np/nowPlaying.txt,函数(数据){
var nowPlaying=data.split(“\n”);
如果(p!=数据){
var p=数据;
var i=0;
document.getElementById('track').innerHTML=nowPlaying[i++];
document.getElementById('by').innerHTML=nowPlaying[i++];
document.getElementById('artist').innerHTML=nowPlaying[i++];
如果(nowPlaying.length==5){
document.getElementById('from').innerHTML=nowPlaying[i++];
document.getElementById('album').innerHTML=nowPlaying[i++];
}
console.log(p)
}
})
var t=设置超时(loadTxt,500);
}
问题在于var p
是在loadTxt
中定义的,因此每次执行loadTxt
,都会得到该变量的一个新实例。相反,在该函数之外定义p
,这样当loadTxt
时,它将始终访问相同的变量实例
还有一些地方可以改进:
- 只有当您已经知道数据不同时,才需要调用
;因此在第一个split
块中if
- 为了避免收到多个挂起的get请求,在可能是慢速连接的情况下,在确定当前get请求返回响应之前,不要启动下一个
。因此,将其移动到setTimeout
回调函数中get
- 您的代码不包括
的声明。目前,您似乎隐式地将其定义为全局变量,然后从不使用它。所以一起放下它t
- 使用更具描述性的变量名
是毫无意义的p
- 在使用jQuery时,请充分使用它,避免冗长的
文档
jQuery(function () { // Only execute when the DOM has loaded
let displayedData; // Define only once (this is your `p`)
// Get a reference to the 5 elements of interest, only once
let $elems = jQuery("#track, #by, #artist, #from, #album");
function loadTxt() {
jQuery.get('http://localhost:8000/np/nowPlaying.txt', function (data) {
if (displayedData != data) {
displayedData = data;
data.split("\n").forEach((txt, i) => $elems.eq(i).text(txt));
}
// Only launch setTimeout when you have the response
setTimeout(loadTxt, 500);
});
}
loadTxt(); // initial start
});
代码还有一个问题:如果以前的数据有五个值(包括相册),但最近的数据只有三个值,那么其余两个值将不会更改。这可能不是你想要的。在这种情况下,您可能希望清除剩余的两个元素
如果是,请将代码更改为:
jQuery(function () { // Only execute when the DOM has loaded
let displayedData; // Define only once (this is your `p`)
// Get a reference to the 5 elements of interest, only once
let $elems = jQuery("#track, #by, #artist, #from, #album");
function loadTxt() {
jQuery.get('http://localhost:8000/np/nowPlaying.txt', function (data) {
if (displayedData != data) {
displayedData = data;
let props = data.split("\n");
$elems.each((i, elem) => $(elem).text(props[i] || ""));
}
// Only launch setTimeout when you have the response
setTimeout(loadTxt, 500);
});
}
loadTxt(); // initial start
});
问题在于
var p
是在loadTxt
中定义的,因此每次执行loadTxt
,都会得到该变量的一个新实例。相反,在该函数之外定义p
,这样当loadTxt
时,它将始终访问相同的变量实例
还有一些地方可以改进:
- 只有当您已经知道数据不同时,才需要调用
;因此在第一个split
块中if
- 为了避免收到多个挂起的get请求,在可能是慢速连接的情况下,在确定当前get请求返回响应之前,不要启动下一个
。因此,将其移动到setTimeout
回调函数中get
- 您的代码不包括
的声明。目前,您似乎隐式地将其定义为全局变量,然后从不使用它。所以一起放下它t
- 使用更具描述性的变量名
是毫无意义的p
- 在使用jQuery时,请充分使用它,避免冗长的
文档
jQuery(function () { // Only execute when the DOM has loaded
let displayedData; // Define only once (this is your `p`)
// Get a reference to the 5 elements of interest, only once
let $elems = jQuery("#track, #by, #artist, #from, #album");
function loadTxt() {
jQuery.get('http://localhost:8000/np/nowPlaying.txt', function (data) {
if (displayedData != data) {
displayedData = data;
data.split("\n").forEach((txt, i) => $elems.eq(i).text(txt));
}
// Only launch setTimeout when you have the response
setTimeout(loadTxt, 500);
});
}
loadTxt(); // initial start
});
代码还有一个问题:如果以前的数据有五个值(包括相册),但最近的数据只有三个值,那么其余两个值将不会更改。这可能不是你想要的。在这种情况下,您可能希望清除剩余的两个元素
如果是,请将代码更改为:
jQuery(function () { // Only execute when the DOM has loaded
let displayedData; // Define only once (this is your `p`)
// Get a reference to the 5 elements of interest, only once
let $elems = jQuery("#track, #by, #artist, #from, #album");
function loadTxt() {
jQuery.get('http://localhost:8000/np/nowPlaying.txt', function (data) {
if (displayedData != data) {
displayedData = data;
let props = data.split("\n");
$elems.each((i, elem) => $(elem).text(props[i] || ""));
}
// Only launch setTimeout when you have the response
setTimeout(loadTxt, 500);
});
}
loadTxt(); // initial start
});
或者您可以尝试这样做(使用闭包,保留以前的值)
或者您可以尝试这样做(使用闭包,保留以前的值)
声明
var p
在这个loadTxt
函数之外,它将工作。顺便说一句,您可以将split
放在第一个if
块中。您需要从GET回调内部调用setTimeout
(以及if
条件内部)@trincot我在哪里声明它?我试图在其他函数中声明它,但它似乎不起作用……`函数p{var p=”“;};不是在另一个函数中。确保其作用域中有loadTxt
。因此,要么是完全全局的,要么在任何函数中都是loadTxt
的包装器<代码>函数p{var p=“”;}非常错误。。。想想看…@trincot-it发出的请求数像几何级数一样不断增加(1,2,4,8,16,…,4096)。我做错了吗?声明var p
在这个loadTxt
函数之外,它将工作。顺便说一句,您可以将split
放在第一个if
块中。您需要从GET回调内部调用setTimeout
(以及if
条件内部)@trincot我在哪里声明它?我试图在其他函数中声明它,但它似乎不起作用……`函数p{var p=”“;};不是在另一个函数中。确保其作用域中有loadTxt
。因此,要么是完全全局的,要么在任何函数中都是loadTxt
的包装器<代码>函数p{var p=”“;}