WEB3中如何设置回调
How to set the call back in WEB3
我在区块链合约中有两个函数来获取地址的投资者和资金,并试图将其保存在 Excel。
第一个函数获取投资者名单:
getInvestorsList()
第二个函数这会将投资者地址作为输入,returns投资者地址和为该地址保存的资金:
getInvestorsAndBalances(address investorAddress)
我能够使用函数 "getInvestorsList" 和 "getInvestorsAndBalances".
获得投资者名单和他们赞助的基金
问题
- 以下将数据转换为 excel 的代码片段只有在函数 "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);
});
- 我使用 Array.map to transform the results into an array of promises 而不是
for
循环,它使用值 return 解析为 getInvestorsAndBalances
中的回调
- 在下一步中,我将对这个承诺数组调用 Promise.all;这导致
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);
});
});
- 我正在使用 arrow functions 而不是函数声明以获得更简洁的代码
- 我正在使用 early return pattern(检查是否有错误,然后立即从函数中 return)以避免 if/else 语句嵌套过多
- 我正在用 const 声明变量
dataSample
;你根本没有声明它,i
或 element
,这使它们成为全局变量——这是一个不好的做法
- 我正在使用 template strings 构建用于 XLS 导出的数据字符串
- 我已经修复了您的数据字符串中的格式问题 – 它没有生成有效的 JSON 因为您对引号和逗号感到困惑
- 我正在使用 Array.map 创建
dataSample
字符串,结合 Array.join 来避免尾随逗号的问题在数据的末尾(导致 JSON 格式无效)
- 我已经删除了控制台语句,假设您只是将它们用于调试
我在区块链合约中有两个函数来获取地址的投资者和资金,并试图将其保存在 Excel。
第一个函数获取投资者名单:
getInvestorsList()
第二个函数这会将投资者地址作为输入,returns投资者地址和为该地址保存的资金:
getInvestorsAndBalances(address investorAddress)
我能够使用函数 "getInvestorsList" 和 "getInvestorsAndBalances".
获得投资者名单和他们赞助的基金问题
- 以下将数据转换为 excel 的代码片段只有在函数 "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);
});
- 我使用 Array.map to transform the results into an array of promises 而不是
for
循环,它使用值 return 解析为getInvestorsAndBalances
中的回调
- 在下一步中,我将对这个承诺数组调用 Promise.all;这导致
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);
});
});
- 我正在使用 arrow functions 而不是函数声明以获得更简洁的代码
- 我正在使用 early return pattern(检查是否有错误,然后立即从函数中 return)以避免 if/else 语句嵌套过多
- 我正在用 const 声明变量
dataSample
;你根本没有声明它,i
或element
,这使它们成为全局变量——这是一个不好的做法 - 我正在使用 template strings 构建用于 XLS 导出的数据字符串
- 我已经修复了您的数据字符串中的格式问题 – 它没有生成有效的 JSON 因为您对引号和逗号感到困惑
- 我正在使用 Array.map 创建
dataSample
字符串,结合 Array.join 来避免尾随逗号的问题在数据的末尾(导致 JSON 格式无效) - 我已经删除了控制台语句,假设您只是将它们用于调试