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
});
我知道我可以通过引用它来更改变量,但出于某种原因我有这个代码:
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
});