循环中的NodeJS + Express调用异步方法

时间:2018-09-13 01:23:01

标签: node.js express ethereum

我正在尝试使用NodeJS和Express创建一个Web api函数,从私有以太坊区块链中检索数据。

问题在于方法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 :(得分:1)

我认为在这种情况下,像Bluebird这样的库确实很有帮助。在使用可迭代项和Promise时,可以使用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
});

有关更多信息,您可以参考蓝鸟docs