JSFiddle - React, Tailwind, and code Playground

by anzeo

JavaScript

function ConversionRatesMap(){
    var map = {};
    
    this.get = function(from, to){
        var promiseRateIsAvailable = $.Deferred();
        
        if(map[from] && map[from][to]) {
            return promiseRateIsAvailable.resolve(map[from][to]);
        }
        
        this.add(from, to).done(function(rate){
            promiseRateIsAvailable.resolve(rate);
        });
 
        return promiseRateIsAvailable;
    }
    
    this.add = function(from, to){
        var promise = $.Deferred();
        
        if(!map[from]){
            map[from] = {};
        }
        
        // mimic call to the BE
        setTimeout(function(){
            map[from][to] = 5;
            promise.resolve(map[from][to]);
        }, 2000);
        
        return promise;
    }
}

function CurrencyConverter(){
    var ratesMap = new ConversionRatesMap
    
    this.convert = function(amount, from, to){
        var promise = $.Deferred(),
            rate = ratesMap.get(from, to).done(function(rate){
                promise.resolve(amount * rate);
            });
        
        return promise;
    }
}
// cc.convert(5, 'EUR').to('USD')
var cc = new CurrencyConverter();

cc.convert(5, "EUR", "USD").done(function(convertedValue){
    alert(convertedValue);
});