javascript中的全局变量不变
我知道我可以通过引用它来更改变量,但出于某种原因,我有以下代码:javascript中的全局变量不变,javascript,solidity,smartcontracts,Javascript,Solidity,Smartcontracts,我知道我可以通过引用它来更改变量,但出于某种原因,我有以下代码: function getCertInfo() { inputHolder = document.getElementById("stdIDNumber").value; var holdStudentName; var isExist = false; contract.methods.isEntity(inputHolder).call().then(function(result) {
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,并返回布尔值
但是!
如果我运行代码并输入现有ID。。第一个控制台日志将是真的,这是好的,但第二个将是假的,这对我来说是有意义的 时间问题,因为
contract.methods.isEntity().call()
返回一个承诺(然后
),并且异步执行。试试这个:
函数getCertInfo(){
//从用户输入获取ID
var inputHolder=document.getElementById(“stdIDNumber”).value;
//检查ID是否存在
var isExist=contract.methods.isEntity(inputHolder.call)()
.然后(函数(结果){
//向用户显示结果
var display=document.getElementById(“结果显示”);
display.innerHTML=result?“证书存在!”:“证书不存在!”;
//然后向用户显示结果(如果存在)。
//但它必须在“当时”的承诺范围内
//否则它将是未定义的
}).catch(函数(err){
控制台日志(错误消息);
});
}
然后用一个按钮调用这个方法。诀窍是等待承诺被“解决”,然后用结果更新容器。时间问题,因为
contract.methods.isEntity().call()
返回一个承诺(then
),并异步执行。试试这个:
函数getCertInfo(){
//从用户输入获取ID
var inputHolder=document.getElementById(“stdIDNumber”).value;
//检查ID是否存在
var isExist=contract.methods.isEntity(inputHolder.call)()
.然后(函数(结果){
//向用户显示结果
var display=document.getElementById(“结果显示”);
display.innerHTML=result?“证书存在!”:“证书不存在!”;
//然后向用户显示结果(如果存在)。
//但它必须在“当时”的承诺范围内
//否则它将是未定义的
}).catch(函数(err){
控制台日志(错误消息);
});
}
然后用一个按钮调用这个方法。诀窍是等待承诺被“解决”,然后用结果更新容器。这就是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
});
这就是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
});
如果您正在调用
。那么
,该方法可能是异步的。当第二个控制台日志运行时,contract.methods.isEntity(inputHolder.call()
尚未完成,因此,isExist
的值仍然是false
。那么我该如何克服这一点呢..因此当它查看智能合约并发现ID存在时,它会将变量isExist更改为false?在您的情况下,isExist
变量只存在于getCertInfo
函数的范围内,因为它是声明和在中初始化。你的目标是什么,你目前有什么问题?getCertInfo
应该返回什么吗?所以我的目标是创建一个存储学生证书的区块链。。在前端。。。有一个用于输入学生ID的输入字段和一个用于发送该ID的按钮。。然后显示学生信息。。所以如果用户输入ID并点击发送。。。我希望它检查区块链,看看ID是否存在,是否不存在。它会说找不到证书。我更新了下面的答案-请查看并让我知道它是否有用!如果您正在调用。那么
,该方法可能是异步的。当第二个控制台日志运行时,contract.methods.isEntity(inputHolder.call()
尚未完成,因此,isExist
的值仍然是false
。那么我该如何克服这一点呢..因此当它查看智能合约并发现ID存在时,它会将变量isExist更改为false?在您的情况下,isExist
变量只存在于getCertInfo
函数的范围内,因为它是声明和在中初始化。你的目标是什么,你目前有什么问题?getCertInfo
应该返回什么吗?所以我的目标是创建一个存储学生证书的区块链。。在前端。。。有一个用于输入学生ID的输入字段和一个用于发送该ID的按钮。。然后显示学生信息。。所以如果用户输入ID并点击发送。。。我希望它检查区块链,看看ID是否存在,是否不存在。它会说找不到证书。我更新了下面的答案-请查看并让我知道它是否有用@asim目前您的getCertInfo函数似乎非常无用。你的计划是什么?目标是什么?@asim目前您的getCertInfo函数似乎非常无用。你的计划是什么?目标是什么?