0

我正在使用 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也是新手。

4

1 回答 1

3

一种想法是不要尝试直接存储数据,因为由于异步结果的不确定性,尝试访问数据的代码不知道它何时有效。因此,您可以存储 Promise 和任何想要访问数据的代码,只需.then()/.catch()在 Promise 上使用即可。无论异步时间如何,这将始终有效。如果数据已经存在,.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()处理程序分配给您希望在 Promise 链之外的其他代码中通常使用的更高范围的变量几乎总是一个麻烦代码的标志 - 不要这样做。这是因为承诺链之外的其他代码不知道该数据何时有效或无效。

于 2018-01-08T17:27:25.053 回答