Suppose I have a web application returning exchange rate for given currency pair at /exchange_rate/ccy1/ccy2, whenever the currency pair is not found in the database, the web app returns 404.
In the front-end JavaScript code, to be fail-safe, whenever local exchange rate query fails, I'll then query a public provider, say currencyconverterapi.com
Let's also assume for some reason (the actual code uses Vue lifecycle hooks), the global variable rate, and the two functions can't be merged and can't be made into async.
The problem with the following code is it only works when local query axios.get('/exchange_rate/EUR/' + ccy) resolves; when it rejects, the amount * rate will execute before axios.get('http://free.currencyconverterapi.com...) sets rate --
var rate;
function getExchangeRate(ccy) {
return axios.get('/exchange_rate/EUR/' + ccy)
.then(ret => {
rate = ret.data.rate;
}).catch(err => {
axios.get('http://free.currencyconverterapi.com/api/v5/convert?q=EUR_'
+ ccy).then(ret => {
rate = ret.data.results.val;
});
});
}
function toEUR(ccy, amount) {
getExchangeRate(ccy)
.then(() => {
return amount * rate;
});
}
var EURAmount = toEUR('USD', 42);
My question is: is there a way to guarantee rate is properly set by getExchangeRate in toEUR?