Асинхронная / ожидающая проблема заказа в обратном вызове web3.js - PullRequest
0 голосов
/ 21 декабря 2018



Проблема в том, что я использую 2 асинхронные функции одну за другой.Каждый из них вызывает метод из смарт-контракта, а другие сотрудники выполняют обратный вызов «чека».

Код:

await first()
await second()

let first = async function () {
   await myContract.methods.methodOne()
   .send({from: account})
   .on('receipt', async () => {
    console.log('1')
    async someAsyncFunction()
   })
}

let second = async function () {
   await myContract.methods.methodOne()
   .send({from: account})
   .on('receipt', async () => {
    console.log('2')
    console.log(variableFromContract) // undefined
   })
}

let someAsyncFunction = async function () {
   setTimeout(() => {
      variableFromContract = 10;
   }, 2000);
}

В чем проблема с некоторыми функциями AsyncFunction?Почему он не работает до функции second ()?

Заранее спасибо.(Я использую версию web3.js 1.0.0-beta.37)

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Несколько вопросов здесь:

let first = async function () {
   await myContract.methods.methodOne()
   .send({from: account})
   .on('receipt', async () => {
    console.log('1')
    async someAsyncFunction() // <--- should be return await someAsyncFunction() so you have a value to pass onto second
   })
}

let second = async function () {
   await myContract.methods.methodOne()
   .send({from: account})
   .on('receipt', async () => { // <-- this is an async function but you don't await anything inside of it
    console.log('2')
    console.log(variableFromContract) // undefined
   })
}

let someAsyncFunction = async function () { // again async function but awaiting nothing to resolve.
   setTimeout(() => {
      variableFromContract = 10;
   }, 2000);
}
0 голосов
/ 21 декабря 2018

Я нашел ответ после многих попыток, нет необходимости помещать асинхронный метод в обратный вызов 'получение', просто используйте

...
.on('receipt', () => {
    console.log('block mined') 
})
.then( async () => { 
    await someAsyncFunction() // put the code here
})
...