NodeJS + Экспресс вызов асинхронного метода в цикле - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь создать функцию веб-API с NodeJS и Express, получая данные из приватной цепочки блоков ethereum.

Проблема в том, что метод mytoken.tokenOfOwnerByIndex... является асинхронным методом в цикле, но хочет дождаться всех результатов, пока не будет выполнено, и позволить функции вернуть tokenIds в результате.

Я пытался использовать async / await, но не знаю, как их правильно использовать.

Вот фрагмент моего текущего кода:

app.get("/get", function(req, res, next){

  var Web3 = require('web3');
  var BigNumber = require('bignumber.js');

  Web3.providers.HttpProvider.prototype.sendAsync = Web3.providers.HttpProvider.prototype.send;
  var web3 = new Web3();
  web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));

  var contract = require("truffle-contract");
  var contractJson = require("./build/contracts/MyToken.json");
  var MyToken = contract(contractJson);
  MyToken.setProvider(web3.currentProvider);
  var tokenIds = [];
  MyToken.deployed().then(function(mytoken) {
    var account0 = web3.eth.accounts[0];
    mytoken.balanceOf(accounts0).then(function(balance){
      var x = balance.toNumber();
      for (i = 0; i < x; i++){
        mytoken.tokenOfOwnerByIndex(account0,0).then(function(tokenId){
          var y = tokenId.toNumber();
          tokenIds.push(y);
        });
      }
      res.json(tokenIds);
    });
  });
});

Кто-нибудь может направить меня или дать мне подсказку?

1 Ответ

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

Я думаю, что в таких случаях библиотека типа Bluebird действительно полезна.При работе с итерациями и обещаниями вы можете использовать метод Bluebird map() ( map ).

Так как у вас есть номер здесь (var x) и не повторяется, вы можете сделать что-то вроде этого

var Promise = require('bluebird);

var x = balance.toNumber();
var promises = []; 
for (i = 0; i < x; i++){
   promises.push(mytoken.tokenOfOwnerByIndex(account0,0));
});

Promise.all(promises).then(function(results) {
   //do something
});

Вы можете обратиться к Bluebird docs для получения дополнительной информацииинформация

...