[英]How to set the call back in WEB3
我在区块链合同中有两个功能来获取地址的投资者和资金,并试图将其保存在Excel中。
第一项功能要获得投资者名单:
getInvestorsList()
第二功能这将以投资者地址为输入,并返回投资者地址和为该地址节省的资金:
getInvestorsAndBalances(address investorAddress)
我可以使用“ getInvestorsList”和“ getInvestorsAndBalances”功能来获取投资者名单以及他们赞助的资金。
题
如何使下面的代码等待函数“ getInvestorsAndBalances”的成功完成?
dataSample = dataSample + "]";
console.log("dataSample: " + dataSample);
//var dataSample = [{"address": "abc","balance": "21.22"}];
const xls = new XlsExport(dataSample, 'Example WB');
xls.exportToXLS('export.xls')
完整的代码
crowdSaleContractObj.getInvestorsList(function(error, result){
if(!error)
{
for (i=0; i < result.length; i++) {
crowdSaleContractObj.getInvestorsAndBalances(result[i],function(error, result1){
console.log(i);
if(!error)
{
console.log(i + " - Address : " + result1[0]+ ", Balance : " + result1[1]);
element = " {\"address\": " + result1[0] + ",balance:" + result1[1] + "},";
console.log("element: " + element);
dataSample = dataSample + element;
}
else
console.error(error);
});
}
dataSample = dataSample + "]";
console.log("dataSample: " + dataSample);
//var dataSample = [{"address": "abc","balance": "21.22"}];
const xls = new XlsExport(dataSample, 'Example WB');
xls.exportToXLS('export.xls')
}
else
console.error(error);
});
这是可以使用的代码版本:
crowdSaleContractObj.getInvestorsList(function(error, results) {
if (!error) {
const promises = results.map(function(result, i) {
return new Promise((resolve, reject) => {
crowdSaleContractObj.getInvestorsAndBalances(result[i], function(
error,
result1
) {
console.log(i);
if (!error) {
console.log(
i + " - Address : " + result1[0] + ", Balance : " + result1[1]
);
resolve(result1);
} else {
console.error(error);
reject(error);
}
});
});
});
Promise.all(promises)
.then(function(results1) {
results1.forEach(r => {
element = ' {"address": ' + r[0] + ",balance:" + r[1] + "},";
console.log("element: " + element);
dataSample = dataSample + element;
});
dataSample = dataSample + "]";
console.log("dataSample: " + dataSample);
//var dataSample = [{"address": "abc","balance": "21.22"}];
const xls = new XlsExport(dataSample, "Example WB");
xls.exportToXLS("export.xls");
})
.catch(function(error) {
console.error(error);
});
} else console.error(error);
});
for
循环,将结果转换为一个promise数组,该数组用返回给getInvestorsAndBalances
的回调的值getInvestorsAndBalances
then
方法中的代码 完善守则
我已经自由地重构了您的代码,以使用现代语言功能并修复了一些错误:
crowdSaleContractObj.getInvestorsList((error, results) => {
if (error) {
console.error(error);
return;
}
const promises = results.map(
(result, i) =>
new Promise((resolve, reject) => {
crowdSaleContractObj.getInvestorsAndBalances(
result[i],
(error, result1) => {
if (error) {
reject(error);
return;
}
resolve(result1);
}
);
})
);
Promise.all(promises)
.then(results1 => {
const dataSample = `[${results1
.map(r => `{"address": "${r[0]}", "balance": ${r[1]}}`)
.join(", ")}]`;
const xls = new XlsExport(dataSample, "Example WB");
xls.exportToXLS("export.xls");
})
.catch(function(error) {
return console.error(error);
});
});
dataSample
; 您根本没有声明它,也没有声明i
或element
,这使它们成为全局变量–这是一个坏习惯 dataSample
字符串,并与Array.join结合使用,以避免在数据末尾出现逗号(导致无效的JSON格式)的问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.