Разрешить заморозить в реакции во время звонков - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь установить счетчик, пока приложение реагирует на несколько звонков.Пишу Dapp с web3 и солидностью.Во время выполнения вызовов моего умного контракта я пытаюсь установить состояние, чтобы показать счетчик, но все приложение зависает, пока выполняются вызовы контракта, после выполнения вызовов и возвращаемых значений он устанавливает счетчик и очень быстро сбрасывает счетчик (Вы можете видеть консоль изменения значения, регистрирующую логическое значение).Приложение размораживается и продолжается.Как я могу настроить счетчик и приложение, чтобы оно не зависало во время звонка:

onSubmit(e) {
    e.preventDefault();
    // inProcessOfCalling sh
    this.setState({ inProcessOfCalling: true });
    ...
    const contractData = callContract(parseTestJson.steps, web3);
    Promise.all(contractData).then((values) => {
        ...
        // turn spinner off
        this.setState({ inProcessOfCalling: false });
    });
}

function callContract(callInfo, web3) {
    const dataArr = [];
    for (let i = 0; i < callInfo.length; i += 1) {
        // ...
        const getData = thisContract[callInfo[i].func].getData(
            ...callInfo[i].args,
            { from: callInfo[i].from },
        );
        // ...
        const trans = web3.eth.sendTransaction({
          to: callInfo[i].contract,
          from: callInfo[i].from,
          data: getData,
        });
        let receipt = web3.eth.getTransactionReceipt(trans);
        returnObj = {
          receipt,
          testName: callInfo[i].name,
          expectPassed: callInfo[i].expects.success === transactionPassed,
          expectMessage: callInfo[i].expects.message,
        };
        dataArr.push({ error: false, returnObj });
    }
    return dataArr;
}

Не думаю, что это проблема web3.Я предположил бы, что это заморозит приложение с несколькими вызовами извлечения API.

1 Ответ

0 голосов
/ 12 сентября 2018

Вы уже вызываете тяжелую функцию callContract и запрос здесь <- это та, которая вызывает <code>hang

const contractData = callContract(parseTestJson.steps, web3); он уже вызывается перед тем, как положить его в Promise.all

и contractData вовсе не являются Обещанием, вы можете просто вернуть объект Обещания внутри этой функции, как эта

function callContract(callInfo, web3) {
  return new Promise((resolve, reject) => {
      const dataArr = [];
      for (let i = 0; i < callInfo.length; i += 1) {
        // ...
        const getData = thisContract[callInfo[i].func].getData(
          ...callInfo[i].args, {
            from: callInfo[i].from
          },
        );
        // ...
        const trans = web3.eth.sendTransaction({
          to: callInfo[i].contract,
          from: callInfo[i].from,
          data: getData,
        });
        let receipt = web3.eth.getTransactionReceipt(trans);
        returnObj = {
          receipt,
          testName: callInfo[i].name,
          expectPassed: callInfo[i].expects.success === transactionPassed,
          expectMessage: callInfo[i].expects.message,
        };
        dataArr.push({
          error: false,
          returnObj
        });
      }
      resolve(dataArr);
    }
  }

Узнайте больше об обещании здесь https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

...