如何从回调函数中获取值

时间:2011-08-04 18:32:42

标签: javascript jquery rss google-api

我对javascript相对较新,我面临一些困难。我有两个java脚本文件,如下所示。我无法在getRss函数中获取变量 entry_title 的值并将其存储在变量 Rss1_title Rss2_title 中。创建一个全局变量并将其分配给 entry_title 会使事情变得更糟,因为我无法知道标题来自哪个Rss url。有没有一种简单的方法来获得回调函数的价值?

<script type="text/javascript" src="jsRss.js"></script>
<script type="text/javascript" src="notification.js"></script>

我的notification.js文件

    function get_rss1_feeds(){
        var Rss1_title = getRss("http://yofreesamples.com/category/free-coupons/feed/?type=rss");
    }

    function get_rss2_feeds(){
        var Rss2_title = getRss("http://yofreesamples.com/category/real-freebies/feed/?type=rss");  
    }
setTimeout('get_rss1_feeds()',8000);
setTimeout('get_rss2_feeds()',7000);

我的jsRss.js文件:

function getRss(url){

    if(url == null) return false;

    google.load("feeds", "1");

    // Our callback function, for when a feed is loaded.
    function feedLoaded(result) {
        if (!result.error) {

            var entry = result.feed.entries[0];             
            var entry_title = entry.title;      // need to get this value           
        }

    }       
    function Load() {
        // Create a feed instance that will grab feed.
        var feed = new google.feeds.Feed(url);
        // Calling load sends the request off.  It requires a callback function.
        feed.load(feedLoaded);              
    }
    google.setOnLoadCallback(Load);             
}

错误:

当setTimeout(get_rss1_feeds,8000);方法叫做我得到一个空白的屏幕。 我的控制台中出现错误,指出八进制文字和八进制转义序列已弃用,它指向此脚本中的第6行。 是因为我使用google-api来解析我的Rss吗?

if (window['google'] != undefined && window['google']['loader'] != undefined) {
if (!window['google']['feeds']) {
window['google']['feeds'] = {};
google.feeds.Version = '1.0';
google.feeds.JSHash = '8992c0a2cdf258e5bd0f517c78243cd6';
google.feeds.LoadArgs = 'file\75feeds\46v\0751';
}
google.loader.writeLoadTag("css", google.loader.ServiceBase + "/api/feeds/1.0/8992c0a2cdf258e5bd0f517c78243cd6/default+en.css", false);
google.loader.writeLoadTag("script", google.loader.ServiceBase + "/api/feeds/1.0/8992c0a2cdf258e5bd0f517c78243cd6/default+en.I.js", false);
} 

2 个答案:

答案 0 :(得分:1)

虽然它会使你的代码变得混乱,但你可以将变量附加到window对象。 例如:

function a()
{
 window.testStr = "test";

}

function b()
{
 alert(window.testStr);
}

甚至可以创建自己的对象,而不是使用窗口:

var MyRSSReader = {
 TitleOne : '',
 TitleTwo : '' 
} 

MyRSSReader.TitleOne = "My title";

Wikipedia有一篇关于全局变量的好文章,以及它们为什么不好。

答案 1 :(得分:1)

看到它是一个不同的范围,您可以在回调中返回它,或者以其他方式提供它,例如将其导出到您所需位置可见的更高范围。在这种情况下,它是全球范围,所以我建议不要这样做。

function getRss(url, callback) {
//...
function feedLoaded(result) {
    if (!result.error) {
        var entry = result.feed.entries[0];
        var entry_title = entry.title; // need to get this value
        callback && callback(entry_title);        
    }
}

并且这样称呼,

function get_rss1_feeds() {
    var Rss1_title = getRss("http://yofreesamples.com/category/free-coupons/feed/?type=rss", function(entry_title) {
        // This scope has access to entry_title
    });
}

顺便说一下,像这样使用你的setTimeout:

setTimeout(get_rss1_feeds, 8000);

而不是

setTimeout("get_rss1_feeds()", 8000);

因为后者使用eval,而前者传递对函数的引用。