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
}