为了账号安全,请及时绑定邮箱和手机立即绑定

异步/等待承诺逻辑问题

异步/等待承诺逻辑问题

汪汪一只猫 2021-10-07 11:00:30
我正在学习如何将 async/await 与 Promise 结合使用。我对第一个承诺有一些问题。具体来说:var pres = mvc.Components.get("search1");pres.data('results', {  count: 0,  output_mode: 'json_rows'}).on("data", function(results) {  alldata3 = results._data;  console.log(alldata3)});    我正在从另一个脚本中的函数中提取结果。'search1' 的结果非常大。例如,它需要更长的时间然后搜索两个。我遇到的问题是,它不会等到“results._data”完全分配给 alldata3 后才转到 itVolTwo()。这最终给我一个异步错误,指示“alldata3.rows”未定义。无论如何要重新设计它,以便它等到它从search1接收到完整结果?这里最好的做法是什么?谢谢你的帮助!
查看完整描述

1 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

您应该“承诺”事件发射器对象(something.data.on),然后您可以等待结果:


  const itVolOne = async () => {

    if (boolpool) {

        const pres = mvc.Components.get("search1");

        const alldata3 = await new Promise(resolve => {

             pres.data('results', {count: 0, output_mode: 'json_rows'}).on("data",

               results => {

                   resolve(results._data);

               }

             );

        });

        console.log(JSON.stringify(alldata3));


        const rdbms1 = mvc.Components.get("search2");

        const alldata32 = await new Promise(resolve => {

           rdbms1.data('results', {count: 0, output_mode: 'json_rows'}).on("data",

             results => {

                resolve(results._data);

             }

           );

        });


        console.log(JSON.stringify(alldata32));


        return { alldata3, alldata32 }

    } else {

       throw new Error('Unable to get the datas');

    }

  }

因此,现在 itVolOne 函数以“同步方式”返回所有结果,其余函数可以重写:


  const itVolTwo =  alldata3 => {

      return alldata3.rows.reduce((rdbmsData, row) => {

          rdbmsData[row[0]] = {

            "crit": row[1],

            "high": row[2],

            "med":  row[3], 

            "low":  row[4]

          };


          return rdbmsData;

      }, {});

  }


  const itVolThree = alldata32 => {

     return alldata32.rows.reduce((presData, row) => {

          presData[row[0]] = {

             "crit": row[1],

             "high": row[2],

             "med":  row[3], 

             "low":  row[4]

          };

          return presData;

     }, {});

  }


  const itVolFour = (rdbmsData, presData) => {

     function sum(a, b) {

        Object.keys(b).forEach(k => {

            if (b[k] && typeof b[k] === 'object') return sum(a[k] = a[k] || {}, b[k]);

            a[k] = (+a[k] || 0) + +b[k];

        });

        return a;

      }

      return [rdbmsData, presData].reduce(sum);

  }

现在您只能在第一步中等待:


  async function itInit() {

    try {

        console.log('I got to the call YEY!');


        const { alldata3, alldata32 } = await itVolOne();

        const stepTwo = itVolTwo(alldata3);

        const stepThree = itVolThree(alldata32);

        const endData = itVolFour(stepTwo, stepThree);


        console.log(JSON.stringify(endData));

        console.log('Done');

    }

    catch (error) {

        console.log('u done f\'ed up');

    }

  }

并调用主函数:


itInit();

就这样。


查看完整回答
反对 回复 2021-10-07
  • 1 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信