как получить значение из функции обратного вызова - PullRequest
0 голосов
/ 04 августа 2011

Я относительно новичок в javascript и столкнулся с некоторыми трудностями. У меня есть два файла java-скриптов, как я показал ниже. У меня проблемы с получением значения переменной entry_title внутри функции getRss и сохранением его внутри переменных Rss1_title и Rss2_title . Создание глобальной переменной и присвоение ей entry_title ухудшит ситуацию, так как я не смогу узнать, с какого Rss URL-адреса пришел заголовок. Есть ли простой способ получить значение функций обратного вызова?

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

Мой файл уведомлений.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); метод называется я получаю пустой экран. Я получаю сообщение об ошибке в консоли: восьмеричные литералы и восьмеричные escape-последовательности устарели , и это указывает на 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 ]

1 голос
/ 04 августа 2011

Видя, что это другая область, вы можете либо возвратить ее в обратном вызове, либо предоставить ее другим способом, например экспортировать ее в более высокую область, видимую в выбранном вами месте.В данном случае это глобальная область видимости, поэтому я бы посоветовал против этого.

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, тогда как первый передает ссылку на функцию.

1 голос
/ 04 августа 2011

Несмотря на то, что это сделает ваш код беспорядочным, вы можете добавить переменные к объекту окна. Например:

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

}

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

Или даже создайте свой собственный объект, вместо использования окна, как такового:

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

MyRSSReader.TitleOne = "My title";

Википедия имеет хорошую статью о глобальных переменных и почему они плохие.

...