怎么在for循环里面获取一个全局变量的值

怎么在for循环里面获取一个全局变量的值


var addrs;
var nr = "";
//info
var names;
//presale_info
var raise_min; 
var raise_max; 
PresaleFactory.methods.getPresales().call({from:account},function(error,addrs){//获取到的是一个数组,是一组地址。

    for(var i=0;i<addrs.length;i++){
        PresaleNewAddr = addrs[i];

        PresaleNew=new provider.eth.Contract(PresaleNewAbi,PresaleNewAddr);   //通过这个地址数组

        PresaleNew.methods.tokeninfo().call({from:account},function(error,token){ //通过这个地址数组,得到名字数组
            names = token.name;
        });


        PresaleNew.methods.presale_info().call({from:account},function(error,info){ //通过这个地址数组,得到最大值和最小值数组
            raise_min = info.raise_min; 
            raise_max = info.raise_max; 
        });

        //最终  需要在这里得到names,raise_min,raise_max  组成

        //目前这里无法得到 names ,  raise_max,  raise_max这个值
        nr +='<div><h1>'+names+'</h1><h2>'+raise_min+'</h2><h3>'+raise_max+'</h3></div>';
        $("#nr").html(nr);
    }
});
  1. 你获取不到值的原因是你的请求是异步的,按下面的代码改写下就行
  2. 代码如下,我没有你的环境,盲写的,思路是这么个思路,有瑕疵,如有问题请及时反馈,我再完善
PresaleFactory.methods.getPresales().call({from: account}, function (error, addrs) {//获取到的是一个数组,是一组地址。
    for (var i = 0; i < addrs.length; i++) {
        PresaleNewAddr = addrs[i];
        PresaleNew = new provider.eth.Contract(PresaleNewAbi, PresaleNewAddr);   //通过这个地址数组
        const namePromise = new Promise(resolve => {
            PresaleNew.methods.tokeninfo().call({from: account}, function (error, token) { //通过这个地址数组,得到名字数组
                resolve({name: token.name});
            });
        });

        const minMaxPromise = new Promise(resolve => {
            PresaleNew.methods.presale_info().call({from: account}, function (error, info) { //通过这个地址数组,得到最大值和最小值数组
                resolve({raise_min: info.raise_min, raise_max: info.raise_max})
            })
        });
        Promise.all([namePromise, minMaxPromise]).then(result => {
            let data = result.reduce((t, i) => ({...t, ...i}), {});
            $("#nr").append('<div><h1>' + data.name + '</h1><h2>' + data.raise_min + '</h2><h3>' + data.raise_max + '</h3></div>')
        })
    }
});

【如何在for循环里面获取变量值】https://www.codenong.com/45220510/

设置全局变量可以考虑使用window对象。
这里使用的call方法可能存在异步的情况,这样的话会导致nr拼接时获取不到数据。
并且这里for循环内使用$("#nr").html(nr);,不存在异步的情况下会导致nr元素内仅显示最后一次遍历取到的数据。
建议优化写法。

PresaleFactory.methods.getPresales().call({from:account},function(error,addrs){
    for(var i=0;i<addrs.length;i++){
        PresaleNewAddr = addrs[i];
        PresaleNew=new provider.eth.Contract(PresaleNewAbi,PresaleNewAddr);  
        PresaleNew.methods.tokeninfo().call({from:account},function(error,token){
            window.names = token.name;
        });
 
        PresaleNew.methods.presale_info().call({from:account},function(error,info){
            window.raise_min = info.raise_min; 
            window.raise_max = info.raise_max; 
        });
        nr +='<div><h1>'+window.names+'</h1><h2>'+window.raise_min+'</h2><h3>'+window.raise_max+'</h3></div>';
        $("#nr").html(nr);
    }
}); 

需要看下完整的代码才方便定位问题在哪里,提供一个demo

JS中for循环“全局”变量的传递 - 走看看

你的代码没有问题,如果你输出那全局变量没有值,那么你要在:

PresaleNew.methods.tokeninfo().call({from:account},function(error,token){ //通过这个地址数组,得到名字数组
            console.log(token.name);//在这样的地方去测试返回的最终有没有值
            names = token.name;
        });

那两个赋值的地方正常调用了没?打断点看看赋值的时候变量值是什么?

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632