Javascript 异步/等待返回未定义的值

Javascript 异步/等待返回未定义的值,javascript,typescript,asynchronous,async-await,undefined,Javascript,Typescript,Asynchronous,Async Await,Undefined,我已经找到了一个解决方案,但没有能够实现它 async processMAC(macs){ let datos = []; for(let x in macs){ await this.ipdataService.getMacsSaData(macs[x]).subscribe(data =>{ datos.push(data) } )} return datos; } this.processMAC(

我已经找到了一个解决方案,但没有能够实现它

async processMAC(macs){
    let datos = [];
    for(let x in macs){
      await this.ipdataService.getMacsSaData(macs[x]).subscribe(data =>{ 
        datos.push(data)
      }
    )}
    return datos;   
  }


this.processMAC(macs).then(result => {//I want to work with result but it is undefined}

如果你在使用承诺

async processMAC(macs){
    let datos = [];
    for(let x in macs){
       datos.push(await this.ipdataService.getMacsSaData(macs[x])
    )}
    return datos;   
}
或者如果您想并行执行
getMacsSaData

function processMAC(macs){
    return Promise.all(macs.map(mac => this.ipdataService.getMacsSaData(mac))) 
}

奇怪的是,虽然示例代码片段中可能有一些错误,但不确定这是否可行:

let macsSaData = await this.ipdataService.getMacsSaData(macs[x]);
macsSaData.subscribe(data => { 
    datos.push(data)
}

还可以在回调中设置断点,查看是否已将正确的数据推入数组。

等待。订阅(…)
没有意义,订阅方不是承诺。事实上,查找承诺和可观察性之间的差异实际上并不等价。第一个示例将逐个等待
this.ipdataService.getMacsSaData(macs[x])
。它是异步的,但如果要测量整个函数,则需要
n*x
大量的时间。第二个示例并行处理这些请求,并返回一个承诺,该承诺在它们全部完成时解析。第二个示例也缺少
async/await
。见: