JSFiddle - React, Tailwind, and code Playground

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/bacon.js/0.7.70/Bacon.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<div id='pending'></div>
<form>
    <a href='javascript: void(0);'>upload one</a>
    <a href='javascript: void(0);'>upload two</a>
    <button id='submit'>Submit</button>
</form>

CSS

form * {
    display: block;
}

JavaScript

function toResultStream(promise) {
  return Bacon.fromPromise(promise)
}

var bus = new Bacon.Bus();

var deferreds = $('a').asEventStream('click', function (event) {
    event.preventDefault();
    var deferred = $.Deferred();

    // simulate upload
    setTimeout(function () {
        deferred.resolve(true);
    }, _.random(200, 1600))
    
    setTimeout(function () {
        deferred.rejectWith(false);
    }, _.random(200, 1600))
    
    bus.push(-1);
        
    return deferred;        
});

var ongoingSearch = deferreds
    .flatMap(toResultStream)
    .mapError(1)
    .merge(bus)
    .scan(0, function (memo, n) { return memo + n; })
    .onValue(function (value) {
        var disabled = value < 0;
        $('#submit').attr('disabled', disabled);
    })