在异步编程中停止javascript循环

在异步编程中停止javascript循环,javascript,ethereum,web3,Javascript,Ethereum,Web3,我知道javascript是异步的,如果我在之后创建一个for循环,那么循环就结束了,只有到那时对象承诺才会变得清晰,但是我不能用我的一生来修复这个代码片段,也许有人可以帮助我。我的目标是循环并检查我从函数中获取的变量ans是否等于变量account,如果是,则打印出我从其他函数中获取的信息 loopforCetrs : function() { var num; var account = web3.currentProvider.selectedAddress

我知道javascript是异步的,如果我在之后创建一个for循环,那么循环就结束了,只有到那时对象承诺才会变得清晰,但是我不能用我的一生来修复这个代码片段,也许有人可以帮助我。我的目标是循环并检查我从函数中获取的变量ans是否等于变量account,如果是,则打印出我从其他函数中获取的信息

loopforCetrs : function() {
        var num;
        var account = web3.currentProvider.selectedAddress;

        App.contracts.StudentState.deployed().then(function (instance) {
        return instance.showNumOfContracts();
      }).then(function (numOfCert) {
          num = numOfCert;

            var wrapper = document.getElementById("myHTMLWrapper");

            for (var i = 0; i < num; i++) {
                App.ShowAddress(i).then(function (ans) {

                    if(ans == account) {
                        alert(ans+' Hello');
                        alert(account+' Hi')
                        App.ShowFName(i).then(function (ans) {
                            wrapper.innerHTML += '<span class="test">Name: ' + ans + ' </span><br/><br/>';
                        })

                        App.ShowLName(i).then(function (ans) {
                            wrapper.innerHTML += '<span class="test">Surname: ' + ans + ' </span><br/><br/>';
                        })

                        App.ShowInstName(i).then(function (ans) {
                            wrapper.innerHTML += '<span class="test">Institutions name: ' + ans + ' </span><br/><br/>';
                        })

                        App.ShowAddress(i).then(function (ans) {
                            wrapper.innerHTML += '<span class="test">Users address: ' + ans + ' </span><br/><br/>';
                        })

                        App.ShowCourseName(i).then(function (ans) {
                            wrapper.innerHTML += '<span class="test">Course name: ' + ans + ' </span><br/><br/>';
                            wrapper.innerHTML += '<span class="test"></span><br/><br/>';
                        })
                    }
                })

            }

      })
    },
编辑1:这是我以前使用过的代码,它完成了任务,但现在我想添加一个东西并撞到墙上

loopforCetrs : function() {
        var num;
        var account = web3.currentProvider.selectedAddress;

        App.contracts.StudentState.deployed().then(function (instance) {
        return instance.showNumOfContracts();
      }).then(function (numOfCert) {
          num = numOfCert;

            var wrapper = document.getElementById("myHTMLWrapper");

            for (var i = 0; i < num; i++) {

                App.ShowFName(i).then(function (ans) {
                    wrapper.innerHTML += '<span class="test">Name: ' + ans + ' </span><br/><br/>';
                })

                App.ShowLName(i).then(function (ans) {
                    wrapper.innerHTML += '<span class="test">Surname: ' + ans + ' </span><br/><br/>';
                })

                App.ShowInstName(i).then(function (ans) {
                    wrapper.innerHTML += '<span class="test">Institutions name: ' + ans + ' </span><br/><br/>';
                })

                App.ShowAddress(i).then(function (ans) {
                    wrapper.innerHTML += '<span class="test">Users address: ' + ans + ' </span><br/><br/>';
                })

                App.ShowCourseName(i).then(function (ans) {
                    wrapper.innerHTML += '<span class="test">Course name: ' + ans + ' </span><br/><br/>';
                    wrapper.innerHTML += '<span class="test"></span><br/><br/>';
                })
            }

      })
    },

按照预期的方式使用承诺。当ES6 async/await和模板文本变得如此简单时,看到这段代码简直是噩梦:

loopforCetrs : async function() {
    const account = web3.currentProvider.selectedAddress;
    const numOfCert = await (await App.contracts.StudentState.deployed()).showNumOfContracts());
    const wrapper = document.getElementById("myHTMLWrapper");

    for (let i = 0; i < numOfCert; i++) {
        if((await App.ShowAddress(i)) == account) {
            //alert(ans+' Hello'); no more ans
            alert(account+' Hi');
            wrapper.innerHTML += `<span class="test">Name: ${await App.ShowFName(i)} </span><br/><br/>`;
            wrapper.innerHTML += `<span class="test">Surname: ${await App.ShowLName(i)} </span><br/><br/>`;
            wrapper.innerHTML += `<span class="test">Institutions name: ${await App.ShowInstName(i)} </span><br/><br/>`;
            wrapper.innerHTML += `<span class="test">Users address: ${await App.ShowAddress(i)} </span><br/><br/>`;
            wrapper.innerHTML += `<span class="test">Course name: ${await App.ShowCourseName(i)} </span><br/><br/>`;
            wrapper.innerHTML += `<span class="test"></span><br/><br/>`;
        }
    }
}
这样,当回调已经解决时,您就不会遇到i是错误值的问题,因为一切都在等待,并且在我更改值之前,保证在循环迭代中完全解决


仍然有很多冗余,但我更喜欢的解决方法是向应用程序添加方法,这些方法返回的信息不仅仅是一条微不足道的信息。使用一个返回所有相关信息的程序,您可以减少另外5行冗余代码,并大大提高性能和效率。

按预期方式使用承诺。当ES6 async/await和模板文本变得如此简单时,看到这段代码简直是噩梦:

loopforCetrs : async function() {
    const account = web3.currentProvider.selectedAddress;
    const numOfCert = await (await App.contracts.StudentState.deployed()).showNumOfContracts());
    const wrapper = document.getElementById("myHTMLWrapper");

    for (let i = 0; i < numOfCert; i++) {
        if((await App.ShowAddress(i)) == account) {
            //alert(ans+' Hello'); no more ans
            alert(account+' Hi');
            wrapper.innerHTML += `<span class="test">Name: ${await App.ShowFName(i)} </span><br/><br/>`;
            wrapper.innerHTML += `<span class="test">Surname: ${await App.ShowLName(i)} </span><br/><br/>`;
            wrapper.innerHTML += `<span class="test">Institutions name: ${await App.ShowInstName(i)} </span><br/><br/>`;
            wrapper.innerHTML += `<span class="test">Users address: ${await App.ShowAddress(i)} </span><br/><br/>`;
            wrapper.innerHTML += `<span class="test">Course name: ${await App.ShowCourseName(i)} </span><br/><br/>`;
            wrapper.innerHTML += `<span class="test"></span><br/><br/>`;
        }
    }
}
这样,当回调已经解决时,您就不会遇到i是错误值的问题,因为一切都在等待,并且在我更改值之前,保证在循环迭代中完全解决


仍然有很多冗余,但我更喜欢的解决方法是向应用程序添加方法,这些方法返回的信息不仅仅是一条微不足道的信息。使用一个返回所有相关信息的代码,您可以减少另外5行冗余代码,并大大提高性能和效率。

yikes使用该代码。我看到了臭名昭著的for循环的主要问题,当我不是你认为的那样时,是的,当循环结束时,我是最大值,我认为解决方案是避免所有循环,但我只是不知道如何做上面的链接向你展示了如何解决这个问题。作为开发人员,我的问题是为什么会有这么多异步调用?是代码味道不好,结构都错了。为什么有单独的异步调用只是为了得到他们的名字和姓氏?这就像从mongodb中获取第一个名字,然后使用该代码进行另一个查询以获取last name.yikes。我看到了臭名昭著的for循环的主要问题,当我不是你认为的那样时,是的,当循环结束时,我是最大值,我认为解决方案是避免所有循环,但我只是不知道如何做上面的链接向你展示了如何解决这个问题。作为开发人员,我的问题是为什么会有这么多异步调用?结构不全是错误的。为什么有单独的异步调用只是为了得到他们的名字和姓氏?这就像,从mongodb中获取名字,然后再进行另一个查询来获取姓氏。哦,这看起来和感觉都好多了,我会尝试对wait函数做更多的研究,但是numocert行仍然有问题。@RokasPo是的,我的错,放错了括号。我已经编辑过了,现在应该可以用了。非常感谢你,我还想补充一点,在第一次发现后我并不打算放弃,但是你帮了我很大的忙@RokasPo很高兴能为您提供帮助,至于中断声明,我一定是误解了您的问题标题。把它编辑掉,只剩下相关的东西了。哦,看起来感觉好多了,我会尝试对wait函数做更多的研究,但是numocert行仍然有问题。@RokasPo是的,我的错,放错了括号。我已经编辑过了,现在应该可以用了。非常感谢你,我还想补充一点,在第一次发现后我并不打算放弃,但是你帮了我很大的忙@RokasPo很高兴能为您提供帮助,至于中断声明,我一定是误解了您的问题标题。把它删掉,只剩下相关的东西了。