javascript 中的全局变量没有改变

global variable in javascript does not change

我知道我可以通过引用它来更改变量,但出于某种原因我有这个代码:

function getCertInfo() {

    inputHolder = document.getElementById("stdIDNumber").value;
    var holdStudentName;
    var isExist = false;
    contract.methods.isEntity(inputHolder).call().then(function(result) {
        isExist = result;
        console.log(isExist);

    });
    console.log(isExist);

}

我有一个简单的页面,其中包含用于插入学生 ID 的输入和用于发送它的按钮.. 所以该函数假设转到我的智能合约函数来检查区块链中是否存在 id 和 return Boolean

但是! 如果我 运行 代码并输入现有 ID .. 第一个控制台日志将为 True,这很好,但第二个将为 False,这对我来说有意义!

时间问题,因为 contract.methods.isEntity().call() returns 承诺 (then) 并且是异步执行的。试试这个:

function getCertInfo() {

   // GET ID FROM USER INPUT
   var inputHolder = document.getElementById("stdIDNumber").value;

   // CHECK IF ID EXISTS
   var isExist = contract.methods.isEntity(inputHolder).call()
   .then(function (result) {

      // DISPLAY RESULT TO USER
      var display = document.getElementById("resultDisplay");
      display.innerHTML = result ? "The Cert exists!" : "Cert doesn't exist!";

      // Then show the result to the user if it exists. 
      // But it has to be within "then" of the resolved Promise
      // Otherwise it would be undefined

   }).catch(function (err) {

     console.log(err.message);

   });

}

然后只需使用按钮调用该方法即可。诀窍是等到 Promise 为 "resolved",然后用结果更新容器。

这就是 Promises 在 Javascript 中的工作方式。当 .call() 被调用时,代码继续运行以首先将变量记录为 false。但是,当 .call() 异步完成时,回调 (then) 运行并将 isExist 更改为 true 并将其记录下来。

理想情况下,在使用它们时,当您想在应用程序中按顺序执行操作时,您应该链接承诺。

var isExist = false;
contract.methods.isEntity(inputHolder).call().then(function(result) {
    isExist = result;
    console.log(isExist); //will be whatever result is (let's say true)
}).then(function(){
    isExist = false;
    console.log(isExist); //will be false
});