Javascript rxjs在map Rx.Observable.range(1,5.map)中使用异步/等待

Javascript rxjs在map Rx.Observable.range(1,5.map)中使用异步/等待,javascript,asynchronous,typescript,async-await,rxjs,Javascript,Asynchronous,Typescript,Async Await,Rxjs,我想使用async/await从rxjs获得一个列表。我该怎么办 function getData(num){ return new Promise((resolve, reject)=>{ resolve(num + 1) }) } async function create(){ var list = await Rx.Observable.range(1, 5).map(async (num)=>{ const data

我想使用async/await从rxjs获得一个列表。我该怎么办

function getData(num){
    return new Promise((resolve, reject)=>{
        resolve(num + 1)
    })
}

async function create(){
    var list = await Rx.Observable.range(1, 5).map(async (num)=>{
        const data = await getData(num)
        return  data
    }).toArray().toPromise()

    return list
}


Rx.Observable.fromPromise(create()).subscribe(list=>{
    console.log(list)
}, err=>{
    console.log(err)
})
我明白了

[ Promise { 2 },
  Promise { 3 },
  Promise { 4 },
  Promise { 5 },
  Promise { 6 } ]
我想得到这样的数据

[2,3,4,5,6]

这是一个有点老的问题。你可能已经得到了答案,但我认为这是一个很好的挑战,结果也出乎意料地简单

只需从
map()
切换到
concatMap()

您甚至不需要映射函数中的
async
/
wait
位。虽然保留或删除它对我来说似乎没有任何改变

因此,相关比特可以简化为:

async function create() {
  var list = await Rx.Observable.range(1, 5)
    .concatMap(num => getData(num))
    .toArray().toPromise();

  return list;
}
同样,您可以保持问题中的状态,只需将
map
更改为
concatMap
。我只是想看看这能走多远


检查页面底部的控制台查看结果。

我想你想要
承诺。所有(…)
而不是
…toPromise()
你能检查一下这个
flatMap
没有遵守秩序吗,看看这个失败的例子@Akuukis你知道为什么吗?@jayarjo要保留秩序使用
concatMap()
FYI
flatMap
已重命名为
mergeMap
,并标记为已弃用。资料来源: