如何从回调函数中获取值
我对javascript相对较新,我面临一些困难。我有两个java脚本文件,如下所示。 我无法在getRss函数中获取变量entry_title的值并将其存储在变量Rss1_title和Rss2_title中 。 创建一个全局变量并将其分配给entry_title将使事情变得更糟,因为我无法知道标题来自哪个Rss url。 有没有一种简单的方法来获得回调函数的价值?
我的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); }
看到它是一个不同的范围,您可以在回调中返回它,或者以其他方式提供它,例如将其导出到您所需位置可见的更高范围。 在这种情况下,它是全球范围,所以我建议反对。
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,而前者传递对函数的引用。
尽管它会使您的代码变得混乱,但您可以将变量附加到窗口对象。 例如:
function a() { window.testStr = "test"; } function b() { alert(window.testStr); }
甚至可以创建自己的对象,而不是使用窗口,如下所示:
var MyRSSReader = { TitleOne : '', TitleTwo : '' } MyRSSReader.TitleOne = "My title";
维基百科有一篇关于全局变量的好文章,以及它们为什么不好。