Error Web3: no hay métodos sincrónicos sin parámetro de devolución de llamada

Intento cargar el objeto Metamask Web3 en mi interfaz de reacción/redux. Al cargar la página encuentro el siguiente error:

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)

Aquí está el código relevante:

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

Esto se toma directamente de la caja de trufas react-redux ( https://github.com/truffle-box/react-auth-box )

No me dice dónde ocurre el error, dónde falta la devolución de llamada. Estoy un poco confundido porque pensé que las cajas de trufas contienen código de mejores prácticas. que me estoy perdiendo aqui?

Respuestas (1)

Esta sección del código no es de donde proviene el error. Ese código solo crea el objeto web3. El error proviene de algún código que usa web3 para interactuar con un contrato.

Cuando usas web3 puedes hacer esto

var res = myContract.function.call();

o

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

El segundo método es mejor porque la llamada es asíncrona -> incluso si se agota el tiempo de espera, toda la aplicación no se congelará. Metamask va más allá y bloquea a los desarrolladores incluso para que no usen la primera opción. No todas las llamadas web3 pueden ser asíncronas, por ejemplo, las funciones de conversión de números se realizan instantáneamente. Pero todas las llamadas que interactúan con los contratos deben realizarse de forma asíncrona.

¿Cómo lidiar con el argumento? Intenté esto pero el mismo error myContract.function_name(argument).call(function...
myContract.function.call(arg1, arg2..., function (err, res) { //hacer cosas})