Ошибка Web3: нет синхронных методов без параметра обратного вызова

Я пытаюсь загрузить объект Metamask Web3 в свой интерфейс реакции/редукции. При загрузке страницы я сталкиваюсь со следующей ошибкой:

inpage.js:233 Uncaught Error: The MetaMask Web3 object does not support synchronous methods like eth_mining without a callback parameter. See https://github.com/MetaMask/faq/blob/master/DEVELOPERS.md#dizzy-all-async---think-of-metamask-as-a-light-client for details.
at MetamaskInpageProvider.send (inpage.js:233)
at s.send (inpage.js:14300)
at r.mining (inpage.js:14300)
at derez (<anonymous>:2:6079)
at derez (<anonymous>:2:6072)
at derez (<anonymous>:2:6072)
at derez (<anonymous>:2:6072)
at derez (<anonymous>:2:6072)
at derez (<anonymous>:2:6072)
at derez (<anonymous>:2:6072)

Вот соответствующий код:

import store from '../'
import Web3 from 'web3'

export const WEB3_INITIALIZED = 'WEB3_INITIALIZED'
function web3Initialized(results) {
    return {
        type: WEB3_INITIALIZED,
        payload: results
    }
}

let getWeb3 = new Promise(function(resolve, reject) {
    // Wait for loading completion to avoid race conditions with web3 injection timing.
    window.addEventListener('load', function(dispatch) {
        var results
        var web3 = window.web3
        console.log(web3)

        // Checking if Web3 has been injected by the browser (Mist/MetaMask)
        if (typeof web3 !== 'undefined') {
            // Use Mist/MetaMask's provider.
            web3 = new Web3(web3.currentProvider)

            results = {
                web3Instance: web3
            }

            console.log('Injected web3 detected.');

            resolve(store.dispatch(web3Initialized(results)))
        } else {

            // Fallback to localhost if no web3 injection. We've configured this to
            // use the development console's port by default.
            var provider = new Web3.providers.HttpProvider('http://127.0.0.1:9545')

            web3 = new Web3(provider)

            results = {
                web3Instance: web3
            }

            console.log('No web3 instance injected, using Local web3.');

            resolve(store.dispatch(web3Initialized(results)))
        }
    })
})

export default getWeb3

Это взято прямо из блока реакции-редукции трюфелей ( https://github.com/truffle-box/react-auth-box )

Он не говорит мне, где возникает ошибка, где отсутствует обратный вызов. Я немного сбит с толку, так как думал, что коробки с трюфелями содержат код передовой практики. Что мне здесь не хватает?

Ответы (1)

Ошибка не в этом разделе кода. Этот код просто создает объект web3. Ошибка связана с некоторым фрагментом кода, который использует web3 для взаимодействия с контрактом.

Когда вы используете web3, вы можете сделать это

var res = myContract.function.call();

или

myContract.function.call(function (err, res) {
  //do stuff
})

Второй метод лучше, потому что вызов асинхронный -> даже если истечет время ожидания, все приложение не зависнет. Metamask идет дальше и не позволяет разработчикам использовать даже первый вариант. Не все вызовы web3 могут быть асинхронными, например, функции преобразования номеров выполняются мгновенно. Но все вызовы, взаимодействующие с контрактами, должны выполняться асинхронно.

Как поступить с аргументом? Я пробовал это, но та же ошибка myContract.function_name(argument).call(function...
myContract.function.call(arg1, arg2..., function (err, res) { // делать что-то })