【问题标题】:Global variables in Javascript and how to return variables from then() JavaScript functionJavascript 中的全局变量以及如何从 then() JavaScript 函数返回变量
【发布时间】:2019-11-28 19:27:14
【问题描述】:
ShowInfo : function (number) {

        var answer
        App.contracts.StudentState.deployed().then(function (instance) {
            return instance.showFName(number);
        }).then(function (Cert) {
            answer = Cert;
        })

        console.log(answer);
        return answer;

    },

这是我已经尝试完善了太多时间的功能,但我应该这样做。我是 JavaScript 新手,需要这个函数返回一个名为 answer 的变量,但我总是把它当作未定义的,我知道在 JavaScript 中我不能那么容易地拥有全局变量,但我该如何修复这段代码呢?这与我收到数字的以太坊智能合约相关联。

感谢您的时间和精力。

这些是我目前正在使用的两行代码:

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

    var myHTML = '';
    for (var i = 0; i < num; i++) {
        var ans =  App.ShowInfo(i);
        myHTML += '<span class="test">INFO:' + ans + '</span><br/><br/>';
    }

    wrapper.innerHTML = myHTML
ShowInfo : function (number) {

        var answer = App.contracts.StudentState.deployed().then(function (instance) {
            return instance.showFName(number);
        })

        console.log(answer);
        return answer;

    },

【问题讨论】:

  • 你少了一个分号;在 var answer;
  • @GustavoAGarcia the semicolon is optional
  • 我了解异步函数的基础知识,但我很难实现这一点,我尝试过为函数创建变量的回调路线,但我最终遇到了 Object Promise 问题和我很快就陷入了困境,也许你可以用我的代码给我一个例子。对不起,如果我有需要...
  • 是的,忘了添加它,但它仍然不能解决问题。 ://

标签: javascript blockchain ethereum web3js


【解决方案1】:

现在我看到了大局:)

所以..

ShowInfo : function (number) {

        var answer = App.contracts.StudentState.deployed().then(function (instance) {

     console.log(instance.showFName(number)) //this should be in [ans] later
     return instance.showFName(number); 
     //assuming that showFName returns string, not another promise

     })


        return answer; //this is still a Promise

    },

那么……

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

    for (var i = 0; i < num; i++) {
        App.ShowInfo(i).then(function(ans){
        wrapper.innerHTML+='<span class="test">INFO:' + ans+' ('+i.toString()  + ')</span><br/><br/>';
      })

    }

现在我看到您处理多个异步操作,这有点复杂。

如果您处理消耗多个承诺,您需要决定是否要在其中任何一个解决(完成)时采取行动(在您的情况下显示结果),或者可能所有承诺都完成。

我选择在解决特定信息时随时更新您的 html。如果我没有计算错误的括号,我认为它应该可以工作;)

【讨论】:

  • 哦,这真的很清楚,但是为什么现在还没有定义 ans 时,你在 html 中输入了App.ShowInfo(i).then(function(ans)
  • ans 应该被定义。如果不是 .. 我添加了 console.log 以澄清我们是否从 [instance]
【解决方案2】:

您需要返回整个承诺而不是回答,因为您的操作是异步的。在您返回答案的那一刻,它是未定义的。所以.. 据我了解您的意图,您需要返回整个 App.contracts.Stude.... 链。

【讨论】:

  • 我的意图只是返回我从行中得到的东西:instance.showFName(number);我从 Cert 变量中得到相同的数字,但我想这只是不必要的代码
  • 明白。但是你,简单地说,不能那样做。您需要使用 promise 作为您还没有的值的“载体”。您没有它,因为获取该值的过程是异步的。这就是为什么你需要返回 Promise
  • 好吧,我开始明白你的意思了,但我最大的问题是我不明白如何“拆箱”我猜的“运营商”
  • 你将它拆箱:then(function(value) {...})
  • 在你需要消耗(使用)这个值的地方。所以可能超出了这个功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2020-09-11
  • 1970-01-01
相关资源
最近更新 更多