首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Bacon.Bus值与承诺值相结合

将Bacon.Bus值与承诺值相结合
EN

Stack Overflow用户
提问于 2014-05-14 21:57:45
回答 1查看 545关注 0票数 2

我正在用BaconJS在玻璃钢土地上迈出一小步。我有以下代码:

代码语言:javascript
复制
# This will eventually get resolved with some value
dfd = Promise.defer()
promised = Bacon.fromPromise dfd.promise

# Values are occasionally being pushed in here
bus = new Bacon.Bus

# 1. attempt
bus.combine promised, (fromBus, fromPromise) ->
   # This is never invoked

# 2. attempt
Bacon.combineAsArray( bus, promised ).onValues (fromBus, fromPromise) ->
   # This is invoked only once for the latest value from the bus

# 3. attempt
promised.sampledBy(bus).onValue (fromPromise, fromBus) ->
   # No invoke here at all

# These are called asynchronously during application lifespan
bus.push obj1
dfd.resolve value
bus.push obj2
bus.push obj3

我希望通过总线更新每个交付的对象,其中包括那些在承诺被解析之前被推到那里的对象的值。我可以这样做:

代码语言:javascript
复制
bus.onValue (fromBus) ->
    promise.then (fromPromise) ->
        ...

是的,那有效,但我只是不喜欢它,我想看看玻璃钢是否能更优雅地解决它。请问您有什么提示吗?如何使用纯玻璃钢?

更新

我在考虑其他的方法。下面是一些实际发生的背景..。

代码语言:javascript
复制
# Simple function that creates some object instance (if it haven't been created yet ) and returns it
getObject = (name) ->
   unless obj = list[name]
     obj = new Obj()
     bus.push obj

对于每个添加到缓存中的对象,我需要设置一些属性,使其值来自承诺。基本上我可以这样做:

代码语言:javascript
复制
obj = new Obj()
dfd.promise.then (resolvedValue) ->
    obj.someProperty = resolvedValue

如果没有玻璃钢,这是完全可行的解决方案,但是您可能知道,每个.then调用都是异步的。它用性能下降来支付它的代价。我想克服这一点。如果我正确理解它,使用玻璃钢,它只会调用一次.then,然后提供静态值。问题仍然是怎么做..。

解出

看看小提琴。简而言之,它可以是这样的:

代码语言:javascript
复制
bus.flatMap(
    Bacon.combineAsArray.bind Bacon, promised
).onValue ([fromPromise, fromBus]) ->
    fromBus.specialProperty = fromPromise
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-14 23:40:38

看起来您正在寻找flatMap (再次):

代码语言:javascript
复制
busValuesWithPromise = bus.flatMap (busValue) ->
    Bacon.combineAsArray(promised, busValue)
busValuesWithPromise.onValues (fromPromise, fromBus) ->
    # every bus update, together with the promise value
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23665879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档