Можно ли приостановить код до тех пор, пока обещание не будет выполнено? - PullRequest
0 голосов
/ 25 мая 2020

Мой код содержит прослушиватель событий ниже. Я пытаюсь приостановить свой код до тех пор, пока не будет разрешено обещание (window. ethereum .enable ()) в прослушивателе событий. Как мне go это сделать?

window.addEventListener('click', async () => {
      if (window.ethereum) {
        this.web3 = new Web3(window.ethereum);
        try {
          await window.ethereum.enable();
          alert("if:" + this.web3)
          return this.web3;
        } catch(err){}
      }
      else if (window.web3) {
        this.web3 = window.web3;
        return this.web3;
      }
      else {
        const provider = new Web3.providers.HttpProvider('wss://ropsten.infura.io/ws/v3/PROJECT-ID');
        this.web3 = new Web3(provider);
        return this.web3;
      }

      this.web3.eth.getAccounts().then(accounts => { this.state.account = accounts[0]});
    })

1 Ответ

0 голосов
/ 25 мая 2020

Нет, в настоящее время это невозможно в javascript (если вы не хотите что-то взломать с помощью веб-воркеров, но это не то, что вам здесь нужно). Даже await - это только синтаксический сахар, чтобы код выглядел процедурным, но он использует обещания под капотом. Причина в том, что javascript запускает только один поток, поэтому нет «другого» потока, который должен был бы ждать.

Что вы можете сделать, так это сначала запустить какой-то «индикатор загрузки» "чтобы показать пользователю, что материал загружается. Затем вызовите свой асинхронный c материал и дайте ему обратный вызов (например, функцию resolve обещания), чтобы установить ваше приложение в следующее состояние (т.е. удалить индикатор загрузки и сделать то, что когда-либо будет после). Конечно, вы можете использовать синтаксис await, чтобы он выглядел и даже звучал как «ожидание», но имейте в виду, что в действительности выполняется только один поток.

...