我正在尝试使用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);
});
});
});
任何人都可以引导我或给我提示吗?
答案 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