rxjs在map Rx.Observable.range(1,5).map中使用async/await

Moo*_* Jo 5 javascript asynchronous async-await rxjs typescript

我想使用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)
})
Run Code Online (Sandbox Code Playgroud)

我明白了

[ Promise { 2 },
  Promise { 3 },
  Promise { 4 },
  Promise { 5 },
  Promise { 6 } ]
Run Code Online (Sandbox Code Playgroud)

我想得到这样的数据

[2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

Mel*_*igy 11

这是一个稍微陈旧的问题.你可能已经得到了答案,但我认为这是一个很好的挑战,结果也是一个非常简单的挑战!

只需切换map()flatMap().

而你甚至不需要映射函数中的async/ awaitbit.虽然保留或删除它似乎对我没有任何改变.

因此,相关位可以简化为:

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

  return list;
}
Run Code Online (Sandbox Code Playgroud)

而且,你可以完全按照你在问题中的方式保留它,然后map改为flatMap.我只是想知道这可以走多远

这是一个有效的例子

检查页面底部的控制台以获取结果.

  • `flatMap` 不保持顺序,请参阅此失败示例 https://codepen.io/anon/pen/YoaWgx?editors=0011 (2认同)