async-await - 让异步方法上的 await 调用等到完成
问题描述
我有一个 observable,它返回 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 件物品。
解决方案
工作代码
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
你的 observable 转换为一个 Promise。在这种情况下,它会返回承诺,当您调用时,getSomeMidiNotes
您将能够使用await
.
推荐阅读
- azure-active-directory - Azure AD 中基于组的许可 - 获取直接许可和继承许可 AzureAD 模块
- python - 使用python json模块的JSON解码器错误
- oracle - Oracle APEX:交互式网格 PL/SQL 流程
- java - Arrays.copyOf 不返回对象的深层副本
- java - 将 Java 日历转换为 ISO 的最简单方法
- bash - Bash:从引用字符串块中的每个引用字符串创建一个变量
- sql - SQL 子查询从 if else 语句返回超过 1 个值
- javascript - OpenStreetMap - 如何使用可下载的数据库?
- python - XQuery 到 API Python 字符串
- symfony - Symfony 4,从数据夹具类中获取根路径目录