В настоящее время я работаю с nodejs и web3 и сталкиваюсь с проблемами с асинхронной моделью и, возможно, с конкретной реализацией вызовов web3.Приведенный ниже код предоставит мою конкретную проблему, и я верю, что ответом будет шаблон, который можно использовать в другом месте.
Основной вопрос: как получить баланс с помощью запроса getBalance при сохранении контекста учетной записиза что я спрашивал?
Код для краткости упрощен.
У меня есть список:
var ethAccounts = ['0xabc', '0xdef', '0x123'];
Мой код будет перебирать список, получать баланс каждого и что-то с ним делать.Просто, правда?Я могу использовать getBalance (), используя прототип:
web3.eth.getBalance( account, blockNumber(optional), callback (optional) )
catch: getBalance - это асинхронный вызов, который возвращает Promise.
var balance = web3.eth.getBalance( ethAccounts[0] );
.. баланс не будет тем, что янужно, когда он вернется.
Официальное руководство:
web3.eth.getBalance("0x407d73d8a49eeb85d32cf465507dd71d507100c1")
.then(console.log);
> "1000000000000"
Мне не нужно значение на консоли, поэтому я создаю функцию для его получения.
web3.eth.getBalance(ethAccounts[0]).then(
function( value ) {
var balance = value;
// In this scope, I *can't see* ethAccounts[0]
console.log(balance);
}
);
В моем функциональном блоке мне нужны и учетная запись и значение.
Возможно, обратный вызов может помочь:
function testCallback( value1, value2 ) {
console.log(value1 + ", " + value2 );
}
web3.eth.getBalance(ethAccounts[0], undefined, testCallback );
Вывод на консоль будет:
100000000000000000000, undefined
Я пробовал несколько сценариев: добавление параметров в обратный вызов, в функцию-обработчик, пытаясь обмануть обещание с помощью «await».Пока у меня нет ни одного шаблона, с помощью которого я могу сохранить контекст.
Я пропускаю простой Javascript асинхронного шаблона?Как я могу получить баланс в той же области, в которой у меня есть учетная запись в запросе?
Большое спасибо!