асинхронная функция не ждет, чтобы двигаться дальше - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть приложение реагирования, в котором я прячу и показываю кнопки, а не перемещаюсь по страницам, прежде чем показать следующую кнопку, я хочу убедиться, что функция, для которой предназначалась кнопка, завершена.Вот что у меня есть:

Это асинхронная функция:

async handleTransferFromEthereum(){
    parseAddress(this.state.sc)
    this.setState(prevState => ({
         isEthTransferVisible: !prevState.isEthTransferVisible,
         isGoDeployedVisible: !prevState.isGoDeployedVisible
    }));  
}

, и это будет функция, которую я вызываю:

import ERC20ABI from './blockchain/ERC20ABI.js';
import ethweb3 from './blockchain/ethweb3.js';
import _ from 'lodash';

var addressesValues = [];
var uniqueAddresses = [];
var values = [];
var count = 0;
var map = {};
var address =[];
var amounts=[];
var choppedAdrresses = [];

export  function parseAddress(_smartcontract){
    console.log("Scanning blockchain")
     var contractObj =  new ethweb3.eth.Contract(ERC20ABI,_smartcontract);
     contractObj.getPastEvents(
        'Transfer' || 'allEvents',
        {
               fromBlock: 0,
               toBlock: 'latest'
        },
        function(err,res){
           for(var i =1; i< res.length; i++){
             if (uniqueAddresses.includes(res[i].returnValues.from)===false) {
                  uniqueAddresses[count] = res[i].returnValues.from;
                  values[count] = parseInt(0);
                  map[uniqueAddresses[count]] = values[count];
                  count+=1
             }
             if (uniqueAddresses.includes(res[i].returnValues.to)===false){
                uniqueAddresses[count] = res[i].returnValues.to;
                values[count] = parseInt(0);
                map[uniqueAddresses[count]] = values[count];
                count+=1
              }
          }
          for(var j = 0; j< res.length; j++){
                 map[res[j].returnValues.from] -= parseInt(res[j].returnValues.value);
                 map[res[j].returnValues.to] += parseInt(res[j].returnValues.value);
           }

           for(var x = 0; x < uniqueAddresses.length; x++){
                 addressesValues.push([uniqueAddresses[x], parseInt(map[res[x].returnValues.to])])
           }

              for(var y=0; y < addressesValues.length; y++){
                address.push(addressesValues[y][0]);
                amounts.push(addressesValues[y][1]);
              }

               var choppedAdrresses=_.chunk(address, 100);
               var choppedValue=_.chunk(amounts, 100);
               var tokenSum = amounts.reduce((a, b) => a + b, 0);
               sessionStorage.setItem("addresses", JSON.stringify(address))
               sessionStorage.setItem("tokenSum", JSON.stringify(tokenSum))
               sessionStorage.setItem("choppedAdrresses", JSON.stringify(choppedAdrresses))
               sessionStorage.setItem("choppedValue", JSON.stringify(choppedValue))
           }
         );
   }

Любые указатели будутдействительно помочь.

Ответы [ 2 ]

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

Обещание начинается, когда вы его создаете, и await будет ждать его разрешения.Но код в середине этих двух операторов будет выполняться до того, как обещание закончится.Если вам не нужен результат обещания, вы можете поместить код в эту зону, чтобы парализовать его выполнение обещанием.

const timeBomb = (resolve, reject) => {
  const msleft = Math.random() * 700 + 200;
  console.log("Countdown started!");
  console.log("Only "+(Math.round(msleft)/1000)+" seconds left!!");
  setTimeout(resolve, msleft);
};


waiter = async (p) => {
  console.log("I will hurry to do my last wish before dying");
  const result = await p;
  console.log("It Exploded!");
}

waiter(new Promise(timeBomb));
0 голосов
/ 30 ноября 2018

Вам нужно дождаться обещания, но поскольку функция getPastEvents работает в шаблоне обратного вызова, вы можете создать собственное обещание и вернуть его из parseAddress метода

export  function parseAddress(_smartcontract){
  console.log("Scanning blockchain")

    return new Promise(function(resolve, reject) {

         var contractObj =  new ethweb3.eth.Contract(ERC20ABI,_smartcontract);
         contractObj.getPastEvents(
            'Transfer' || 'allEvents',
            {
                   fromBlock: 0,
                   toBlock: 'latest'
            },
            function(err,res){
               if (err) {
                  reject(err);
               }
               for(var i =1; i< res.length; i++){
                 if (uniqueAddresses.includes(res[i].returnValues.from)===false) {
                      uniqueAddresses[count] = res[i].returnValues.from;
                      values[count] = parseInt(0);
                      map[uniqueAddresses[count]] = values[count];
                      count+=1
                 }
                 if (uniqueAddresses.includes(res[i].returnValues.to)===false){
                    uniqueAddresses[count] = res[i].returnValues.to;
                    values[count] = parseInt(0);
                    map[uniqueAddresses[count]] = values[count];
                    count+=1
                  }
              }
              for(var j = 0; j< res.length; j++){
                     map[res[j].returnValues.from] -= parseInt(res[j].returnValues.value);
                     map[res[j].returnValues.to] += parseInt(res[j].returnValues.value);
               }

               for(var x = 0; x < uniqueAddresses.length; x++){
                     addressesValues.push([uniqueAddresses[x], parseInt(map[res[x].returnValues.to])])
               }

                  for(var y=0; y < addressesValues.length; y++){
                    address.push(addressesValues[y][0]);
                    amounts.push(addressesValues[y][1]);
                  }

                   var choppedAdrresses=_.chunk(address, 100);
                   var choppedValue=_.chunk(amounts, 100);
                   var tokenSum = amounts.reduce((a, b) => a + b, 0);
                   sessionStorage.setItem("addresses", JSON.stringify(address))
                   sessionStorage.setItem("tokenSum", JSON.stringify(tokenSum))
                   sessionStorage.setItem("choppedAdrresses", JSON.stringify(choppedAdrresses))
                   sessionStorage.setItem("choppedValue", JSON.stringify(choppedValue))
                   resolve();
               }
          );
      });
}

После этого вы можетеиспользуйте await как

async handleTransferFromEthereum(){
    await parseAddress(this.state.sc)
    this.setState(prevState => ({
         isEthTransferVisible: !prevState.isEthTransferVisible,
         isGoDeployedVisible: !prevState.isGoDeployedVisible
    }));  
}

Однако, если это возможно, попробуйте преобразовать getPastEvents, чтобы он возвращал обещание вместо использования обратного вызова

...