我试图从函数中的函数返回结果

时间:2014-08-07 14:52:47

标签: javascript xml json

我有一个返回JSON数据的函数,我希望全局访问数据。我已经尝试将函数作为变量返回,然后再次返回它。 新闻目前仍然未定义。

我想要的是var News等于results.feed的值

 var News = function (){

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



      var foo;
      function initialize() {
        var feed = new google.feeds.Feed("http://www.telegraph.co.uk/news/uknews/rss");
        feed.setNumEntries(10);
      //console.log(feed),
        feed.load(function(result) {
         if (!result.error) {
          console.log(result.feed);
          foo = result.feed;
        }

      });
    };

    google.setOnLoadCallback(initialize);

    return foo;
  }();
  console.log(News);

2 个答案:

答案 0 :(得分:1)

您的主要问题是,在请求完成之前调用了return foo;。 JS引擎启动请求,然后继续操作而不关心结果。 foo并未填充结果。

异步请求的典型问题。

根据documentation load()加载Feed。成功加载Feed后,将调用回调。

feed.load(function(result) {
     /* result is accessible only in this scope*/
}

E.g。为了在页面上显示数据,你必须在回调范围内调用 display() -Function

feed.load(function(result) {
     display(result)
}

您可以(技术上)将结果分配给变量:

feed.load(function(result) {
     globalvar=result;
}

但是你必须维护这个变量的不同状态,因为在某个时间点它没有被设置,并且在稍后的时间点它将被设置。

有不同的方法可以解决这个问题:

1)Promises

2)MVC-Frameworks,如KnockoutBackbonehttps://angularjs.org/ 当这些模型是最新的时,你有模型的地方和事件

答案 1 :(得分:0)

在不知道您正在使用什么网页框架的情况下(比如谷歌。*),很难以更详细的方式提供帮助。

但是,如果我猜测,我会说像JavaScript中的大多数事情一样,这是一个异步操作,你的函数在请求完成之前返回。

这是JavaScript的一大障碍,它不是......像其他语言一样直接,你经常要编写回调,这就是你应该在这里做的。

在你的feed.load中,它需要一个包含结果的函数,这看起来像回调。

feed.load(function(result) {
  if(!result.error) {
    // This will print out the feed (presumably an object).
    console.log(result.feed);
  }
}

你必须自己决定如何最好地处理这个问题,至少清楚地说明你想要实现的目标,而不仅仅是要求代码。