Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript for循环中的回调_Javascript_Jquery - Fatal编程技术网

Javascript for循环中的回调

Javascript for循环中的回调,javascript,jquery,Javascript,Jquery,我试图在一系列设备上循环,并正确填充网页。 但是 for(var i=0;i为什么不存储第一个循环的结果,并在第一个循环完成后进行处理 let deviceStatusToWork = []; for (let i=0; i<t_devices.length; i++) { data_final = data.replace("%Title%",t_devices[i][1] ); data_final = data_final.replac

我试图在一系列设备上循环,并正确填充网页。 但是


for(var i=0;i为什么不存储第一个循环的结果,并在第一个循环完成后进行处理

let deviceStatusToWork = [];
for (let i=0; i<t_devices.length; i++) {
            data_final = data.replace("%Title%",t_devices[i][1] );
            data_final = data_final.replace("%IP%", t_devices[i][0]);
            console.log(i);
            deviceStatusToWork.push(t_devices[i][0])            
        }

for (let i = 0; i < deviceStatusWork; i++) {
getStatus(deviceStatusWork[i], function(status) {                
                data_final = data_final.replace("%Status%","<b>"+status+"</b>");
                $('#t-container').append(data_final);
            });
}
let deviceStatusToWork=[];

对于(设i=0;i),最简单的解决方案是围绕回调创建一个闭包,这可以通过IIFE实现:

for(var i=0;i}
我想,如果
getStatus()
返回承诺,您可以使用
async/await

const myFunc = async () => {
    for (var i=0; i<t_devices.length; i++) {
        data_final = data.replace("%Title%",t_devices[i][1] );
        data_final = data_final.replace("%IP%", t_devices[i][0]);
        console.log(i);
        let status = await getStatus(t_devices[i][0]);
        console.log(i);
        data_final = data_final.replace("%Status%","<b>"+status+"</b>");
        $('#t-container').append(data_final);
    }
}

const getStatus = arg => new Promise( (resolve,reject) => {
    /*do stuff with arg*/
    resolve(status);
} );

myFunc();
constmyfunc=async()=>{
对于(var i=0;i)新承诺((解决,拒绝)=>{
/*用arg做东西*/
决议(地位);
} );
myFunc();

如果您使用ES6,只需在周期声明中将
var i
替换为
let i

否则,请修改回调函数

        for (var i=0; i<t_devices.length; i++) {
            data_final = data.replace("%Title%",t_devices[i][1] );
            data_final = data_final.replace("%IP%", t_devices[i][0]);
            console.log(i);
            getStatus(t_devices[i][0], function(index, status) {
                console.log(index);
                data_final = data_final.replace("%Status%","<b>"+status+"</b>");
                $('#t-container').append(data_final);
            }.bind(null, i));
              //first argument (null) is what would be 'this' 
              //inside function when it is called, but we don't need it
              //second (i) is what will be passed into callback as first argument
              //all other arguments will be passed as second, third and so on
        }

for(var i=0;i因为您使用的是jquery,所以可以使用
每个
实用程序。您的逻辑将在闭包中运行。 看


看看这把小提琴,看看它是如何工作的:

重新构造代码,使用递归而不是for循环,这将解决您的问题。行添加到
#t-container
的顺序重要吗?
        for (var i=0; i<t_devices.length; i++) {
            data_final = data.replace("%Title%",t_devices[i][1] );
            data_final = data_final.replace("%IP%", t_devices[i][0]);
            console.log(i);
            getStatus(t_devices[i][0], function(index, status) {
                console.log(index);
                data_final = data_final.replace("%Status%","<b>"+status+"</b>");
                $('#t-container').append(data_final);
            }.bind(null, i));
              //first argument (null) is what would be 'this' 
              //inside function when it is called, but we don't need it
              //second (i) is what will be passed into callback as first argument
              //all other arguments will be passed as second, third and so on
        }