getBlock
является асинхронным, следовательно, вы разрешаете пустой массив, потому что for
циклы в javascript являются синхронными, но вы используете асинхронный обратный вызов внутри них, и resolve
называется перед tx.push
есть.
Я бы предложил вам рекурсивный асинхронный подход, например:
function getBlockchainTransactions(blockNumber){
var tx = [];
return new Promise(resolve => {
// declare a recrusive async loop.
var recursiveAsyncLoop = function(current, max) {
// If the current index is exactly blockNumber, resolve.
if (current === max) {
resolve(tx);
}
// Otherwise, excute the operation on the actual block.
else {
var i = current;
web3.eth.getBlock(i, function(error, block){
if(!error && block.transactions.length != 0){
console.log(block.transactions);
tx.push(block.transactions);
// once the operation is finished, increase the counter on the next call.
recursiveAsyncLoop(current + 1, max);
}
// In cany case, regardless the above is true or false, continue.
else recursiveAsyncLoop(current + 1, max);
})
}
}
// Begin the loop, from index 0 until blockNumber (excluded).
recursiveAsyncLoop(0, blockNumber);
});
}
async function msg() {
const transakcije = await getBlockchainTransactions(blockNumber);
console.log(transakcije);
}
Приведенный выше код должен вызывать resolve
только тогда, когда элементы эффективно добавляются в массив.