2016-03-16 2 views
0

У меня есть небольшая функция обмена валюты, идущая на веб-сайте, и она отлично работает, но сегодня меня попросили добавить возможность регистрации наилучшего обменного курса и с этого момента получить ее и сравнить с текущим обменным курсом ,Как сравнить результаты из двух разных источников с помощью 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/

ответ

0

Вы можете попробовать использовать $.when()

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), 
     exchangerate = exchange.query.results.rate.Rate; 
    //Do stuff with the exchange rate 
    // added `return` 
    return exchangerate 
} 

function getbestexchange(exchangepair) { 
    // added `return` 
    return $.ajax({ 
     type: "GET" , 
     url: "best"+exchangepair+".xml" , 
     dataType: "xml" 
    }).then(function(xml) { 
     bestrate = $(xml).find('rate').text(); 
     // added `return` 
     return bestrate 
    }); 
}; 

$.when(doexchange(/* value */), getbestexchange(alue/* v */)) 
.then(function(exc, bestexc) { 
    // do comparision stuff 
    console.log(exc[0], bestexc[0]) 
}, function err(jqxhr, textStatus, errorThrown) { 
     console.log(errorThrown) 
}) 

на первый взгляд, я вижу, я бы потерять т он обрабатывает ошибки на исходной функции .

function err() {} в .then() должен обрабатывать отвергнута Jquery обещание возвращаемые передается в качестве параметра $.when()

// do asynchronous stuff 
 
function failOrSucceed(t, type) { 
 
    return $.Deferred(function(d) { 
 
    setTimeout(function() {  
 
     d[type](type === "reject" 
 
       ? new Error(type + "ed jQuery promise") 
 
       : type + "d jQuery promise") 
 
    }) 
 
    }, t).then(function(result) { 
 
    return result 
 
    }) 
 
} 
 

 
$.when(failOrSucceed(1000, "reject"), failOrSucceed(900, "resolve")) 
 
.then(function(a, b) { 
 
    console.log(a, b) 
 
} 
 
// handle error, rejected promise returned from `$.when()` 
 
, function err(e) { 
 
    console.log(e) 
 
}); 
 

 
$.when(failOrSucceed(2000, "resolve"), failOrSucceed(2100, "resolve")) 
 
.then(function(a, b) { 
 
    // do stuff with resolved promise values 
 
    console.log(a, b) 
 
} 
 
// handle error, rejected promise returned from `$.when()` 
 
, function err(e) { 
 
    console.log(e) 
 
})
<script src="https://code.jquery.com/jquery-git.js"></script>

jsfiddle https://jsfiddle.net/4denw07e/

+0

Привет, и спасибо за Ваш ответ! Я еще не пробовал это, чтобы увидеть, работает ли это, но, на первый взгляд, я вижу, что потеряю обработку ошибок в исходной функции. – QuestionerNo27

+0

@ QuestionerNo27 Если ошибка возвращается из одного из значений обещания jQuery в качестве параметров '$ .when()', 'err' функция в' .then() 'должна обрабатывать ошибку – guest271314

+0

Да, поймал ее в конце. Я, должно быть, очень устал! Но я не могу заставить это работать для меня ... – QuestionerNo27

Смежные вопросы