Как получить доступ к данным внутри двойного вложенного массива в асинхронной функции - JavaScript? - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть массив, в котором есть другой массив, содержащий данные, которые мне нужны.

Как мне получить доступ к "0x88def628c16651eb0d86be5ead3d738d0cb27fe947bb786c23105ac5d67a1bd0" в javascript, например? Это отображается при вызове var transakcije.

Я пробовал с:

transakcije [0] [0], но это не имя подмассива,

transakcije [0]

для цикла (transakcija as transakcije) безрезультатно.

Я искал знакомые ответы, но не нашел ничего, чтобы помочь мне. Я ценю любую помощь, которую я получаю. Ниже приведено отображение var transakcije в console.log ().


enter image description here


function getBlockchainTransactions(blockNumber){
    var tx = [];
    return new Promise(resolve => {
        for(var i=0; i<blockNumber; i++){
            web3.eth.getBlock(i, function(error, block){
            if(!error && block.transactions.length != 0){
                console.log(block.transactions);
                tx.push(block.transactions);
            }
        })
        }
            resolve(tx);
    });

}


async function msg() {
    const transakcije = await getBlockchainTransactions(blockNumber);
    console.log(transakcije);
}

1 Ответ

0 голосов
/ 14 ноября 2018

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 только тогда, когда элементы эффективно добавляются в массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...