У меня есть небольшая функция обмена валюты, идущая на веб-сайте, и она отлично работает, но сегодня меня попросили добавить возможность регистрации наилучшего обменного курса и с этого момента получить ее и сравнить с текущим обменным курсом ,Как сравнить результаты из двух разных источников с помощью Ajax?
Так что фрагмент исходной функции состоит в следующем (где exchangepair
устанавливается пользователем - ех 'USDEUR.):
<script type="text/jscript">
function doexchange(exchangepair) {
$.ajax({
url: 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22'+exchangepair+'%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=',
success: function(response) {
successCallback(response);
},
error: function(response) {
//Error display
}
});
}
function successCallback(responseObj){
var stringObj = JSON.stringify(responseObj),
exchange = JSON && JSON.parse(stringObj) || $.parseJSON(stringObj),
exchangerate = exchange.query.results.rate.Rate;
//Do stuff with the exchange rate
}
</script>
Все это прекрасно работает. Поэтому я пошел дальше и создал еще один код, который регистрирует обменный курс сегодняшнего дня как лучший, когда пользователь нажимает кнопку UPDATE. Я зарегистрировал его в XML-файле, так как это наиболее практичное решение в настоящее время.
Так что теперь мне нужно прочитать файл и проанализировать данные И по сравнению с ежедневными данными обменного курса ... Здесь я ударил стену. Чтобы прочитать XML-файл, мне нужен вызов AJAX, и у меня не может быть двух отдельных функций с двумя отдельными вызовами AJAX. Поэтому идеальным было бы сделать общую функцию с общим вызовом AJAX и просто менять переменные в каждом случае ... но дело в том, что мне нужно одновременно получить оба набора данных и сравнить их. Мне нужно получить обменный курс дня из Yahoo Currency и получить наилучшую записанную скорость из этого XML, а затем сравнить их, чтобы сообщить пользователю, нужна ли максимальная скорость для сегодняшнего курса или нет.
До сих пор я был в этом более 5 часов, и моя голова вот-вот взорвется. Я уже потерял контроль над тем, что делаю, и не вижу выхода из этого беспорядка.
Для чего это стоит, это вторая функция AJAX Мне нужно:
<script type="text/jscript">
function getbestexchange(exchangepair) {
$.ajax({
type: "GET" ,
url: "best"+exchangepair+".xml" ,
dataType: "xml" ,
success: function(xml) {
bestrate = $(xml).find('rate').text();
}
});
});
</script>
Так что мне нужно, чтобы сравнить полученные данные этой последней функции прошли через переменную bestrate
с первым Возникающим в результате этого successCallback()
функции в данные, переданные через переменную exchangerate
.
Если кто-нибудь может дать мне руку и помочь мне решить проблему получения данных из обоих этих мест, а затем сравнить их, я был бы очень обязан!
EDIT: После @ вклад guest271314 и комментариев, я создал jsfiddle, чтобы показать вам, ребята, где я нахожусь. Я пошел дальше и внес изменения @ guest271314 рекомендуется, но все же я не могу заставить это работать; он продолжает сбой при вызове .ajax()
для XML-файла. Однако XML-файл работает и работает.
function doexchange(exchangepair) {
// added `return`
return $.ajax({
url: 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22' + exchangepair + '%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback='
}).then(successCallback);
}
function successCallback(responseObj) {
var stringObj = JSON.stringify(responseObj),
exchange = JSON && JSON.parse(stringObj) || $.parseJSON(stringObj),
exchangepair = exchange.query.results.rate.id,
exchangerate = parseFloat(exchange.query.results.rate.Rate).toFixed(2),
exchangedate = exchange.query.results.rate.Date;
$('#todaysrate').find('.pair').html(exchangepair);
$('#todaysrate').find('.rate').html(exchangerate);
$('#todaysrate').find('.date').html(exchangedate);
// added `return`
return exchangerate
}
function getbestexchange(exchangepair) {
// added `return`
return $.ajax({
type: "GET",
url: "http://chiennuperou.com/besthistoric" + exchangepair + ".xml",
dataType: "xml"
}).then(function(xml) {
alert('Hey, I\'m working!');
bestpair = $(xml).find('pair').text();
bestrate = $(xml).find('rate').text();
bestdate = $(xml).find('date').text();
$('#bestrate').find('.pair').html(bestpair);
$('#bestrate').find('.rate').html(bestrate);
$('#bestrate').find('.date').html(bestdate);
// added `return`
return bestrate
});
};
$.when(doexchange(/* value */), getbestexchange(/* value */))
.then(function(exc, bestexc) {
// do comparision stuff
console.log(exc[0], bestexc[0])
}, function err(jqxhr, textStatus, errorThrown) {
$('#error').html(errorThrown);
console.log(errorThrown)
})
$('#refresh').click(function() {
$('#todaysrate').find('.pair').html('. . .');
$('#todaysrate').find('.rate').html('. . .');
$('#todaysrate').find('.date').html('. . .');
$('#bestrate').find('.pair').html('. . .');
$('#bestrate').find('.rate').html('. . .');
$('#bestrate').find('.date').html('. . .');
$('#error').html('');
doexchange('USDEUR');
getbestexchange('USDEUR');
})
var exchangepair;
doexchange('USDEUR');
getbestexchange('USDEUR');
span {
font-weight: bold;
color: #f00;
}
#refresh {
display: inline-block;
color: white;
background: gray;
padding: 5px 7px;
margin-top: 10px;
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="todaysrate">Today's rate (<span class="date"></span>) for <span class="pair"></span> is 1.00/<span class="rate"></span>
</div>
<div id="bestrate">Best rate (<span class="date"></span>) for <span class="pair"></span> is 1.00/<span class="rate"></span>
</div>
<div id="error">
</div>
<div id="refresh">
Refresh
</div>
https://jsfiddle.net/48n0u4gv/17/
Привет, и спасибо за Ваш ответ! Я еще не пробовал это, чтобы увидеть, работает ли это, но, на первый взгляд, я вижу, что потеряю обработку ошибок в исходной функции. – QuestionerNo27
@ QuestionerNo27 Если ошибка возвращается из одного из значений обещания jQuery в качестве параметров '$ .when()', 'err' функция в' .then() 'должна обрабатывать ошибку – guest271314
Да, поймал ее в конце. Я, должно быть, очень устал! Но я не могу заставить это работать для меня ... – QuestionerNo27