繁体   English   中英

如何在WEB3中回拨电话

[英]How to set the call back in WEB3

我在区块链合同中有两个功能来获取地址的投资者和资金,并试图将其保存在Excel中。

第一项功能要获得投资者名单:

getInvestorsList()

第二功能这将以投资者地址为输入,并返回投资者地址和为该地址节省的资金:

getInvestorsAndBalances(address investorAddress)

我可以使用“ getInvestorsList”和“ getInvestorsAndBalances”功能来获取投资者名单以及他们赞助的资金。

  1. 以下将数据转换为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);
});
  1. 我使用的是Array.map ,而不是for循环,将结果转换为一个promise数组,该数组用返回给getInvestorsAndBalances的回调的值getInvestorsAndBalances
  2. 在下一步中,我将根据此诺言调用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);
    });
});
  1. 我使用箭头函数而不是函数声明来获得更多简洁代码
  2. 我正在使用早期返回模式 (检查是否有错误,然后立即从函数返回),以避免过多的if / else语句嵌套
  3. 我用const声明了变量dataSample ; 您根本没有声明它,也没有声明ielement ,这使它们成为全局变量–这是一个坏习惯
  4. 我正在使用模板字符串来构造用于XLS导出的数据字符串
  5. 我已经修复了数据字符串中的格式问题–由于您对引号和逗号感到困惑,因此无法生成有效的JSON
  6. 我正在使用Array.map来创建dataSample字符串,并与Array.join结合使用,以避免在数据末尾出现逗号(导致无效的JSON格式)的问题
  7. 我已经删除了控制台语句,假设您只是使用这些语句进行调试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM