Javascript 我如何不在if条件下使用setTimeout重复函数?

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

我有一个函数,基本上从txt文件中获取数据,对其进行解析,并将解析后的数据放入HTML标记中。此功能设置为超时500

如果一个文件中的数据在函数的最后一次迭代后没有改变,我怎么能不将相同的数据放在HTML标记中呢?因为我不想让它做同样的任务417次,哈哈

我尝试过这个方法,但看起来每次函数迭代后变量都会被删除

函数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=”“;}