baconjs / bacon.js

Functional reactive programming library for TypeScript and JavaScript

Home Page:https://baconjs.github.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

.withLatestFrom(later(1, "foo"), …) depends on JS runtime

semmel opened this issue · comments

B.later(1, "foo") is like B.later(0, "foo") but only when running in Node – as different from when running in browsers.

demo code:

const B = require('baconjs'),
   concat = (a, b) => a + b, 
   s = B.once('foo').withLatestFrom(B.later(1, 'bar'), concat);
// let it run
s.onValue(console.log)

For a nice surprise execute that in Node, e.g. from a project shell where baconjs is installed:

node -e "const B = require('baconjs'), concat = (a, b) => a + b, unsub = B.once('foo').withLatestFrom(B.later(1, 'bar'), concat).onValue(console.log)"
# -> foobar

whereas in browser dev tools there is no event output :

import('./node_modules/baconjs/dist/Bacon.mjs').then(m => { globalThis.B = m; });
var concat = (a, b) => a + b;
var unsub = B.once("foo")
.withLatestFrom(B.later(1, "bar"), concat)
.onValue(s => { console.log(`sampled: "${s}"`); })

I guess I have to treat synchronicity or atomic updates with a grain of salt. 🤔

I'm bit by this as well withLatestFrom seems to be swallowing events around a potential "circular" dependency:

  const qUnavailable = Bacon.constant(true).flatMap(() =>
    qProp.map(query => query.attr === undefined)
  );

  const eventsSub = events
    .log("searchEvent")
    .holdWhen(qUnavailable)
    .log("searchQueryReady")
    .withLatestFrom(
      qProp.log("query"),
      (event, query) => ({
        event: event,
        query: query,
      })
    ).onValue();