如何使用Ajax比较两个不同来源的结果?

时间:2016-03-16 22:13:02

标签: javascript php jquery ajax xml

我在网站上有一点货币兑换功能并且工作正常但今天我被要求增加注册最佳汇率的可能性,从那时起能够检索它并将其与今天的交换进行比较率。

所以原始函数的片段如下(用户设置item - 例如'USDEUR'):

exchangepair

所有这一切都很完美。所以我继续创建了一些代码,当用户点击UPDATE按钮时,它会将今天的汇率记录为最佳。我把它注册在XML文件中,因为它是目前最实用的解决方案。

所以现在我需要读取文件并解析数据 AND 与每日汇率数据进行比较......这就是我碰壁的地方。为了读取XML文件,我需要一个AJAX调用,我不能有两个单独的函数和两个单独的AJAX调用。因此,理想的做法是使用通用的AJAX调用创建泛型函数,并在每种情况下只更改变量......但问题是我需要同时获取两组数据并进行比较。 我需要从雅虎货币获得当天的汇率,并从该XML获得最佳记录汇率,然后将两者进行比较,以便能够告诉用户最佳汇率是否需要更新到今天的汇率。 /强>

到目前为止,我已经在这5个多小时了,我的脑袋即将爆炸。我已经忘记了我一直在做什么,也看不出任何出路。

对于它的价值,这是我需要的第二个AJAX功能:

<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>

所以我需要的是将通过<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()函数的第一个数据进行比较。

如果那里的任何人可以帮助我解决从这两个地方获取数据然后进行比较的问题,我将非常感激!

编辑:在 @ guest271314的贡献和评论之后,我创建了一个jsfiddle来向你们展示我在哪里。我已经推进了 @ guest271314 的推荐,但仍然无法让它发挥作用;它在exchangerate调用XML文件时继续失败。但是,XML文件已启动并正在运行。

.ajax()
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;
}

https://jsfiddle.net/48n0u4gv/17/

1 个答案:

答案 0 :(得分: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()应处理作为参数传递给$.when()

的被拒绝的jQuery承诺

&#13;
&#13;
// 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)
})
&#13;
<script src="https://code.jquery.com/jquery-git.js"></script>
&#13;
&#13;
&#13;

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