让async方法的await调用等待完成

时间:2019-06-06 13:50:50

标签: async-await rxjs

我有一个可观察的对象,它返回500个永无止境的随机数流:

public async getSomeMidiNotes(): Promise<Array<number>> {
  const notes: Array<number> = new Array<number>();
  await this.getRandomMidiNotes()
  .pipe(
    take(500)
  )
  .subscribe(note => {
    notes.push(note);
  });
  return notes;
}

public getRandomMidiNotes(): Observable<number> {
  return interval(MIDI_NOTE_DURATION)
    .pipe(
      map(data => Math.floor(Math.random() * MIDI_NOTE_MAX) + MIDI_NOTE_MIN)
    );
}

我正在使用它返回一个数组:

const gotes: Array<number> = await this.generatorService.getSomeMidiNotes();
console.log(gotes);

但是在浏览器控制台中显示的数组长度总是不同的,有时是2个,有时是50个,等等...

我希望阵列在返回之前能够完全容纳500个项目。

1 个答案:

答案 0 :(得分:0)

工作代码

public async getSomeMidiNotes(): Promise<Array<number>> {
  const notes: Array<number> = new Array<number>();

  return getRandomMidiNotes().pipe(
    take(500),
    map(note => {
      notes.push(note);
      return notes;
    })
  ).toPromise();
}

用法:

const notes: Array<number> = await this.generatorService.getSomeMidiNotes();
console.log(notes);

stackblitz实现:https://stackblitz.com/edit/rxjs-fcmzrp

说明

map函数将项目推送到笔记数组并返回。
toPromise允许您将可观察的转换为承诺。在这种情况下,它会返回诺言,当您致电getSomeMidiNotes时,您将可以使用await