JSFiddle - React, Tailwind, and code Playground

HTML

<script src="http://andersmalmgren.github.io/Knockout.Concurrency/src/knockout.concurrency.js"></script>
<div><input data-bind="value: value"</input></div>
<button data-bind="click: getData">Simulate new save event from backend</button>

CSS

span.concurrency 
{
    background: no-repeat url(https://github.com/AndersMalmgren/Knockout.Concurrency/raw/master/Knockout.Concurrency.Demo/Content/images/icons/warning-16.png);
    padding: 2px 0 2px 16px
}

span.concurrency button
{
    width: 16px;
    height: 16px;
    border: none;
    background: transparent;
    margin-left: 2px;
    cursor: pointer;
}
span.concurrency button.take-local {
        background-image: url(https://github.com/AndersMalmgren/Knockout.Concurrency/raw/master/Knockout.Concurrency.Demo/Content/images/icons/resolve-16.png)
}

span.concurrency button.take-server {
        background-image: url(https://github.com/AndersMalmgren/Knockout.Concurrency/raw/master/Knockout.Concurrency.Demo/Content/images/icons/merge-16.png)

}

JavaScript

ko.extenders.currency = function (target, opt) {
        var result = ko.dependentObservable({
            read: function () {
                return "$" + target();
            },
            write: target
        });


        result.raw = target;
        return result;
    };

ViewModel = function() {
    this.value= ko.observable(5).extend({ currency: true }).extend({ concurrency: true});    
    
    this.getData = function() {
        //Simulate backend data
        var data = { value: 5 };
        var mapping = {
            value: {
                comparer: function(value1, value2, observable) { 
                    return observable.raw() == value2;
                }
            }
        }
        
        new ko.concurrency.Runner().run(this, data, mapping); 
    }
}

ko.applyBindings(new ViewModel());