【问题标题】:Rxjs bind context of place where observable was createdRxjs 绑定创建可观察对象的位置的上下文
【发布时间】:2016-11-22 07:16:00
【问题描述】:

我有一个循环创建的 observables 数组。然后使用 merge 合并所有这些 observable,并订阅合并后的 observable。我找不到一种方法来检索可观察对象的上下文(在循环中)。这是代码

let observable = Rx.Observable.bindNodeCallback(request);
let streams = _(['a', 'b', 'c', 'd'])
 .someMoreLodashStuff()
 .map(val => {
   // HERE SOMEHOW I WANT TO BIND CONTEXT (e.g. loop val),
   // SO THAT SUBSCRIBER CAN KNOW THE EXACT LOOP STATE
   // WHEN RECEIVING RESULT
   return observable(mutate(val))
 })
 .value();

Rx.Observable
.merge(...streams)
.subscribe(
  (res) => {
   // HERE I WANT TO GET CONTEXT (e.g. val)
  }, (err) => {
   // HERE I WANT TO GET CONTEXT (e.g. val)
  },
  () => {
    //on complete stuff
  });

更新(@martin 要求)

由于@martin 询问了此绑定的目的以及我要解决的问题,所以我将描述真正的问题。

假设和实际问题

我正在尝试抓取网站列表(作为查询参数传递),获取它们的标题并将它们呈现在 html 中并将 html 返回给用户。这是我的open source repo 的一部分,其中使用 node.js 回调、async.js 瀑布和 Promise 解决了这个确切的问题。现在使用 rxjs 解决它。它只是学习不同异步技术的一种方式。这是file from github repo 使用 rxjs 解决这个问题的地方

【问题讨论】:

  • 你可以从第一个 map() 返回this。我不明白这应该做什么或您要解决什么问题。为什么订阅者应该知道 map() 操作符某处使用的上下文?
  • @martin 更新了问题。我想现在您可以更好地理解真正的问题,并且您可以看到从第一个 map 返回 this 将导致 Rx.Observable.merge() 失败,因为它需要 Observables。
  • 我还在 github (@martinsik) 中我想要绑定的文件中的确切行标记了你。我希望这可以更好地回答您的问题。

标签: javascript rxjs rxjs5


【解决方案1】:

如果您想保留对输入状态的引用,您可以使用 flatMap 重载,它采用 resultSelector 函数来创建包含合并输入 + 输出状态的元组:

// given a function which can return the body of the page requested
function doRequest(url) : Observable<string>

const urls = Rx.Observable.from([a,b,c])
  .flatMap(
    a => doRequest(url),
    (a,res) => ({ url: a, body: res})
  )
  .subscribe(resTuple => console.log(`url ${resTuple.url} returned ${resTuple.body}`)

【讨论】:

  • 精彩的答案,正是我所期待的。非常感谢@Mark。
  • 只有一个问题,resultSelector 仅在成功处理程序上可用,我们可以通过任何方式获取错误处理程序
  • 您可以使用catch 处理来自doRequest 的错误,这有帮助吗?
  • 是的,这就是我最终使用的。我是 final file 应用您的建议后。
猜你喜欢
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 2020-08-28
  • 2016-06-18
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
相关资源
最近更新 更多