松露合约与异步等待的互动

时间:2019-01-19 11:11:05

标签: ecmascript-6 async-await ethereum smartcontracts truffle

我正在使用nodejs v.8.15.0和truffle v4.1.15。我已经部署了合同,也可以与它进行交互,但是不能按照truffles page

上的说明进行操作

因为我执行以下其中一项操作:

let accounts = await web3.eth.getAccounts()
let balance = await instance.getBalance(accounts[0])

我收到以下错误:

  

SyntaxError:等待仅在异步功能中有效

使用软件包truffle-contract也会发生同样的情况,即使github description中也有ES6示例:

const deployed = await MyContract.deployed();
const result = await instance.someFunction(5); 

有人知道为什么它不能如示例中所述吗?

1 个答案:

答案 0 :(得分:3)

使用await时,执行代码的功能应标记为异步,例如:

async function _your_function_name() {
  ...

  let accounts = await web3.eth.getAccounts()
  let balance = await instance.getBalance(accounts[0])

  ...
}

您可能还考虑使用异步IIFE来避免将整个功能标记为异步,即使我错过这样做的充分理由也是如此:

...

let accounts
let balance

(async () => {
  accounts = await web3.eth.getAccounts()
  balance = await instance.getBalance(accounts[0])
})()

...

这里有更详细的说明:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function