建议和反馈

请填写你的反馈内容

问答 > 以太坊 > 问答详情
已解决

正确的node.js抽象,以防止访问以太坊区块链时的竞争条件

我正在使用web3版本1.0.0-beta.27,其中对区块链的所有访问都是异步的,显然这开启了竞争条件的可能性,即:

var Web3 = require("web3");     
// connect to etherum blockchain
var ether_port = 'http://localhost:8545'
var web3       = new Web3(new Web3.providers.HttpProvider(ether_port));
// this is how we set the value, note there is the possiblity of race condidtions here
var accounts = []
web3.eth.getAccounts().then(function(accts){
    console.log("printing account: ", accts)
    accounts = accts
})
// observe race condition
console.log("assert race condition: ", accounts[0])

上面的最后一行是设计的,它是为了证明我想accounts在评估之后使用它。即,最终我想从前端express.jsWeb应用程序甚至是移动应用程序修改/读取区块链,因此node.js为了确保严格,有哪些常用工具可以确保竞争条件永远不会发生?这些工具存在吗?如果不是什么常见做法。我也是新手node.js

TLY

2019-05-15

1041

0

撰写答案

请先登陆或注册

1个回答

樱花YING

2019-05-15

一种想法是不尝试直接存储数据,因为试图访问数据的代码由于异步结果的不确定性而不知道它何时有效。因此,相反,您存储承诺和任何想要访问数据的代码,只需使用.then()/.catch()承诺。无论异步时间如何,这都将始终有效。如果数据已存在,.then()则将快速调用处理程序。如果数据尚未存在,那么呼叫者将排队等待数据到达时得到通知。

let accountDataPromise = web3.eth.getAccounts().then(function(accts){
    console.log("printing account: ", accts)
    return accts;
});
// then, elsewhere in the code
accountDataPromise.then(accts => {
    // use accts here
}).catch(err => {
    // error getting accts data
});

仅供参考,将.then()处理程序中的数据分配给您希望通常在承诺链之外的其他代码中使用的更高范围的变量几乎总是代码麻烦的代码 - 不要这样做。这是因为承诺链之外的其他代码不知道该数据何时有效或无效。

0
赞赏(0)
邀请

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励