异步/等待承诺逻辑问题

我正在学习如何将 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接收到完整结果?这里最好的做法是什么?谢谢你的帮助!


汪汪一只猫
浏览 143回答 1
1回答

开满天机

您应该“承诺”事件发射器对象(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();就这样。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript