使用javascript从url获取输出

使用javascript从url获取输出,javascript,csv,Javascript,Csv,我之前的问题与此相关 我从这里引用的代码 很抱歉,如果我再次询问,但我得到的最后一个答案在Windows Gadget环境中不起作用 我试图使用这段代码将csv数据输入变量,但得到的都是NaN function getRate(from, to) { var script = document.createElement('script'); script.setAttribute('src', "http://query.yahooapis.com/v

我之前的问题与此相关

我从这里引用的代码

很抱歉,如果我再次询问,但我得到的最后一个答案在Windows Gadget环境中不起作用

我试图使用这段代码将csv数据输入变量,但得到的都是NaN

    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;
        var rate = parseFloat(data.query.results.row.rate, 10);
        console.log("Exchange rate is " + rate);
        console.log(rate);
      }

 getRate("EUR", "USD");
从getRate函数中的url,以下是输出

{"query":{"count":1,"created":"2015-05-06T04:21:02Z","lang":"en-US","results":{"row":{"rate":"1.1226","name":"EUR/USD"}}}}
我确实得到了想要解析ExchangeRate函数的值,即rate,但我无法将该值解析为其他变量(本例中为abc)

我应该怎么做才能得到变量的值?
提前感谢。

您的问题是您正在将脚本动态添加到页面中。该函数在脚本加载并运行之前立即返回(因此
未定义
),因此它将无法工作。脚本以异步方式加载,而不是像浏览器解析页面时那样以内联方式加载

无论如何,这将起作用:

function getRate(from, to, completed) {
    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");
    script.onload = completed;
    document.body.appendChild(script);
}

var currentRate = 0;

function parseExchangeRate(data) {
    //var name = data.query.results.row.name;
    currentRate = parseFloat(data.query.results.row.rate, 10);
    console.log("Exchange rate is " + currentRate);
}

getRate("EUR", "USD", function(){ console.log("The rate is " +currentRate); });

另一方面,通过允许并行加载一些资源以防止阻塞页面,动态加载脚本可以帮助加快页面加载速度。另外,动态加载脚本意味着您只加载想要加载的脚本。需要注意的是,在执行任何操作之前,您必须先等待它加载

这对我来说就像预期的一样,我没有看到任何问题。我的输出是
汇率是1.1232
,而
getRate
返回
1.1232
。它从parseExchangeData函数中得到的输出很好,但我无法将值输出到其他变量。我想将值传递给“abc”变量,但我在控制台中得到的是未定义的。我只能确认它在浏览器控制台中工作。我想您的问题一定是特定于gadget系统的。@James console.log在gadget中不起作用,所以我正在浏览器上测试它,看看是否有任何输出。在控制台中,abc变量显示
未定义
,parseExchangeRate函数中的值位于该变量之后,并带有我要传递的值。您使用的浏览器是什么?它在Chrome中对我有效。啊,我现在明白了。难怪我不能一次就把它做好。是否有替代方法(静态)而不是使用动态脚本?您可以使用XMLHttpRequest创建同步(阻塞)调用,但除非您正在保存数据(即使如此),否则这是一个糟糕的设计(从Gecko 30.0开始就不推荐)。您可以在这里找到更多详细信息:除此之外,如果您确实进行了阻塞呼叫,并且出现了网络问题,页面将锁定,除非您有一个超时。Async更好。非常感谢Async XMLHttpRequest上的参考链接。它比我之前应用的动态脚本工作得好得多。
function getRate(from, to, completed) {
    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");
    script.onload = completed;
    document.body.appendChild(script);
}

var currentRate = 0;

function parseExchangeRate(data) {
    //var name = data.query.results.row.name;
    currentRate = parseFloat(data.query.results.row.rate, 10);
    console.log("Exchange rate is " + currentRate);
}

getRate("EUR", "USD", function(){ console.log("The rate is " +currentRate); });