Home RxJS: invoke two async calls, return the first that passes a condition, or a special value of none of them does
Reply: 1

RxJS: invoke two async calls, return the first that passes a condition, or a special value of none of them does

Hannes Petri
1#
Hannes Petri Published in 2018-02-12 11:19:40Z

Using RxJS, I want to invoke two different asynchronous operations, which may or may not return null. They may also take indefinite time to complete.

I want to achieve the following:

  • If operation A returns value 1, then immediately return value 1
  • If operation B returns value 2, then immediately return value 2
  • If both operation A and B return null, then return null.

I suppose I can achieve the first two simply as follows:

const bothOperations = merge(callA(), callB());
const firstSuccess = bothOperations.first(res => res !== null);
return firstSuccess;

But how do I get the third possibility into this?

martin
2#
martin Reply to 2018-02-12 11:33:27Z

I think you could do it like this (I'm assuming you're using RxJS 5.5):

merge(callA(), callB())
  .pipe(
    filter(v !== null),
    concat(of(null)),
    take(1),
  )

The take(1) operator makes sure only one value is passed and concat(of(null)) appends null after both source Observables completed.

Just note that if both source Observables run indefinitely than this will never complete. You could add timeout() operator however.

You need to login account before you can post.

About| Privacy statement| Terms of Service| Advertising| Contact us| Help| Sitemap|
Processed in 0.303842 second(s) , Gzip On .

© 2016 Powered by mzan.com design MATCHINFO