Я пытаюсь загрузить объект 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 )
Он не говорит мне, где возникает ошибка, где отсутствует обратный вызов. Я немного сбит с толку, так как думал, что коробки с трюфелями содержат код передовой практики. Что мне здесь не хватает?
Ошибка не в этом разделе кода. Этот код просто создает объект web3. Ошибка связана с некоторым фрагментом кода, который использует web3 для взаимодействия с контрактом.
Когда вы используете web3, вы можете сделать это
var res = myContract.function.call();
или
myContract.function.call(function (err, res) {
//do stuff
})
Второй метод лучше, потому что вызов асинхронный -> даже если истечет время ожидания, все приложение не зависнет. Metamask идет дальше и не позволяет разработчикам использовать даже первый вариант. Не все вызовы web3 могут быть асинхронными, например, функции преобразования номеров выполняются мгновенно. Но все вызовы, взаимодействующие с контрактами, должны выполняться асинхронно.
Уахмед
огненный шрам96