глобальная переменная в javascript не меняется - PullRequest
0 голосов
/ 07 февраля 2020

Я знаю, что могу изменить переменную по ссылке на нее, но по какой-то причине у меня есть этот код:

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);

}

У меня есть простая страница с вводом для вставки идентификатора студента и кнопкой для ее отправки. .. так что функция предполагает go для моей функции умного контракта, чтобы проверить, существует ли идентификатор в блокчейне или нет, и вернуть логическое значение

, но! если я запустил код и поставил существующий идентификатор ... первый консольный журнал будет True, что хорошо, а второй - False, что для меня имеет смысл!

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Вот как Обещания работают в 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
});
1 голос
/ 07 февраля 2020

Проблема синхронизации, так как contract.methods.isEntity().call() возвращает обещание (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);

   });

}

Затем просто вызовите метод с помощью кнопки. Хитрость заключается в том, чтобы подождать, пока обещание не будет «разрешено», а затем обновить контейнер с результатом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...