Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的全局变量不变_Javascript_Solidity_Smartcontracts - Fatal编程技术网

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函数似乎非常无用。你的计划是什么?目标是什么?