【问题标题】:rxjs use async/await in map Rx.Observable.range(1, 5).maprxjs 在 map Rx.Observable.range(1, 5).map 中使用 async/await
【发布时间】:2016-10-03 09:55:15
【问题描述】:

我想使用 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]

【问题讨论】:

  • 我想你想要Promise.all(…) 而不是….toPromise()

标签: javascript asynchronous typescript async-await rxjs


【解决方案1】:

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

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

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

所以,相关位可以简化为:

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

  return list;
}

同样,您可以完全按照问题中的方式保留它,只需将map 更改为concatMap。我只是想看看这能走多远

Here's a working example

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
相关资源
最近更新 更多