【问题标题】:Bacon.js "splitting" an event containing an array into multiple events for each elementBacon.js 将包含数组的事件“拆分”为每个元素的多个事件
【发布时间】:2014-07-04 18:03:40
【问题描述】:

我最近发现了 Bacon.js,并且一直在修补但遇到一个问题。

我有一个事件流 results 用于从 AJAX 请求返回的最近 GitHub 用户。每个结果事件都是一个用户对象数组,例如,[{ id: 1, login: 'somlor' }, { id: 2, login: 'raimohanska' }, ...]

问题:我想创建一个新的users 事件流,它从结果事件中获取信息,并将实际的用户对象作为单个事件返回。这可能吗?

这是我的结果流代码,它按预期工作:

// get some recent github users
var ajaxStream = function() {
  var randomOffset = Math.floor(Math.random() * 500);
  var url = 'https://api.github.com/users?since=' + randomOffset;
  return Bacon.fromPromise($.ajax(url));
}

// refresh click stream, start as true to trigger initial ajax call
var refresh = $('a.refresh').asEventStream('click')
                            .map(true)
                            .startWith(true);

// latest results stream. each event is an array of user objects.
var results = refresh.flatMapLatest(ajaxStream);

这不起作用。它为每个 results 数组创建一个事件流。我希望它将每个 results 数组“拆分”为该数组中每个用户对象的新事件。

// stream of individual users created from each result event array
var users = results.map(function(e) { return new Bacon.fromArray(e); });

有什么想法吗?

谢谢,
肖恩

更新:
这就是我要找的:

var users = results.flatMap(Bacon.fromArray);

【问题讨论】:

    标签: javascript functional-programming reactive-programming bacon.js


    【解决方案1】:

    如果我正确理解了这个问题,您需要使用 .flatMap 来创建流。

    results.flatMap(Bacon.fromArray).onValue(function(v){ console.log(v) });
    

    【讨论】:

    • 这太好了,谢谢@jjuutila。我想然后把它转换成一个新的流我可以做var users = new Bacon.Bus(); 然后results.flatMap(Bacon.fromArray).onValue(function(v) { users.push(v); });
    • 我认为您不需要额外的总线,因为 flatMap 会生成一个新流。
    猜你喜欢
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    相关资源
    最近更新 更多