【问题标题】:how to get the value from a callback function如何从回调函数中获取值
【发布时间】:2011-08-04 18:32:42
【问题描述】:

我对 javascript 比较陌生,遇到了一些困难。我有两个 java 脚本文件,如下所示。我无法在 getRss 函数中获取变量 entry_title 的值并将其存储在变量 Rss1_titleRss2_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);
} 

【问题讨论】:

    标签: javascript jquery rss google-api


    【解决方案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,而前者传递对函数的引用。

    【讨论】:

    • 哇,这是一个有趣的解决方案。我会试试看。谢谢罗伯特
    • 如果我直接调用 get_rss1_feeds() 而不使用 setTimeout(get_rss1_feeds, 8000); 如果我使用它,我的浏览器会显示空白页面并尝试重新加载!知道为什么会这样吗?
    • 当我尝试查看页面源代码时,我什么也看不到!!
    • @Yeshwanth Venkatesh:你一定改变了其他东西。检查控制台错误或空白document.write 调用。
    • 我不确定那个错误是什么!!没有 setTimeout 一切都可以完美运行,我也厌倦了使用 setInterval 但它可以工作
    【解决方案2】:

    尽管它会让你的代码变得一团糟,你可以将变量附加到窗口对象。 例如:

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

    或者甚至创建自己的对象,而不是使用窗口,例如:

    var MyRSSReader = {
     TitleOne : '',
     TitleTwo : '' 
    } 
    
    MyRSSReader.TitleOne = "My title";
    

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

    【讨论】:

    • 由于有两个 Rss url,如果我有一个全局变量,我将无法跟踪它存储的是哪个 Rss 提要的标题!!
    • 只是像现在一样在每个函数中设置不同的变量?
    • 是的,听起来不错。但是 Heuvel 我真的很想避免全局变量。您的解决方案非常好,感谢维基百科文章!
    猜你喜欢
    • 2017-11-05
    • 1970-01-01
    • 2020-01-17
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2021-12-28
    • 2015-08-25
    相关资源
    最近更新 更多