以下函数的目的是访问雅虎服务器上的脚本并查找实时货币兑换率,该兑换率稍后将用于处理客户的购买。
我可以访问 JavaScript 警报中的费率,但似乎无法将它们返回到最初调用该getRate()
函数的 Jquery 方法。
我return rate;
在函数末尾尝试了一个标准parseExchangeRate()
,但它不起作用。我也尝试过在其中设置rate
为全局变量,parseExchangeRate()
但这也不起作用。
function getRate(from, to) {
var script = document.createElement('script');
script.setAttribute('src', "http://query.yahooapis.com/v1/public/yql?q=select%20rate%2Cname%20from%20csv%20where%20url%3D'http%3A%2F%2Fdownload.finance.yahoo.com%2Fd%2Fquotes%3Fs%3D"+from+to+"%253DX%26f%3Dl1n'%20and%20columns%3D'rate%2Cname'&format=json&callback=parseExchangeRate");
document.body.appendChild(script);
}
function parseExchangeRate(data) {
var name = data.query.results.row.name;
rate = parseFloat(data.query.results.row.rate, 10);
alert("Exchange rate " + name + " is " + rate);
}
$(function() {
getRate('USD', 'PHP');
xRatePHP = rate;
/* Do stuff with rate */
});
rate
当我尝试在 Jquery 函数中访问它时,Firebug 通知我未定义。
我尝试的另一件事是设置 http 请求的最后一个参数callback=rate=parseExchangeRate
(不足为奇)也不起作用。
更新
@Relfor 解决了最初的问题,即rate
没有在全局范围内正确声明为全局变量。我解决了这个问题,然后发现了另一个问题,一些人也在下面确定了这个问题,即在getRate()
调用之后(可能需要大约 2000 毫秒来更新变量rate
),脚本立即继续运行,无需等待rate
更新并使用速率,无论是否准备好。
我试图window.setInterval
用来创建一个延迟来解决这个问题,当我注意到他们仍然在线程中活动时,即使我已经接受了@Relfor 的回答,所以我更愿意把它带回这里所以当我们进行这项工作时,其他人可以从解决方案中受益。
有一个最终(我希望 - 最终!)问题,那就是为了简化发布的原始问题,我没有透露我实际上是在尝试从 Yahoo! 获得两个费率。(可能还有更多计划),因此,我getRate()
在循环中调用如下:
function getRate(from, to) {
var script = document.createElement('script');
script.setAttribute('src', "http://query.yahooapis.com/v1/public/yql?q=select%20rate%2Cname%20from%20csv%20where%20url%3D'http%3A%2F%2Fdownload.finance.yahoo.com%2Fd%2Fquotes%3Fs%3D"+from+to+"%253DX%26f%3Dl1n'%20and%20columns%3D'rate%2Cname'&format=json&callback=parseExchangeRate");
document.body.appendChild(script);
}
function parseExchangeRate(data) {
var name = data.query.results.row.name;
rate = parseFloat(data.query.results.row.rate, 10);
}
var rate = 1.00;
var timer;
var q;
var xRatePHP, xRateGBP;
$(function() {
function getTheRates() {
var rateArr = new Array('PHP','GBP');
for (var x=0; x < rateArr.length; x++) {
getRate('USD', rateArr[x]);
q = 0;
timer = window.setInterval(function(){manageTimer(rateArr[x])},100);
}
}
function manageTimer(c) {
if (rate != 1) {
window.clearInterval(timer);
/* Note that 'c' is undefined according to 'alert' below,
* so this next line is not working correctly.
*/
eval("xRate"+c+" = rate;");
alert(c + " = " + rate); // displays 'undefined 43.543'
rate = 1.00;
}
q++;
if (q > 30 ) {
window.clearInterval(timer);
// added below because above isn't working (but neither does this!)
timer = '';
alert(c+' timeout'); // 'c' is undefined according to alert ???
q = 0;
}
}
getTheRates();
/* Do stuff with the rates */
});
有人建议我移到/* Do stuff with the rates */
函数内部,parseExchangeRate()
但不确定考虑到我对getRate()
循环调用的启示,该建议是否仍然有效?
更新 3(替换更新 2)
我在这里创建了一个 JSbin:http://jsbin.com/udikas/3/edit上面除了这两个问题之外似乎正在工作:
1) 超时机制似乎不起作用。
2)在第 33 行这条线alert('start timer (' + x +')');
没有它,计时器似乎没有启动!我不知道为什么,但我不能把那条线留在里面。