2015-01-03 56 views
1

我的服務使用googleapis解析RSS並返回包含其他對象的數組的Object。 下面,鍍鉻控制檯輸出中:

[Object, Object, Object, Object, Object, Object, Object, Object, Object, Object] 
    0: Object 
    1: Object 
    2: Object 
    3: Object 

但在我的控制器不能使用localStorage的檢索數據,控制檯輸出只返回支架或全無:

$scope.feeds = FeedList.get(); 
window.localStorage.setItem('savedData', JSON.stringify($scope.feeds)); 

console.log('TEST : ' + window.localStorage['savedData']); 
console.log('TEST : ' + JSON.parse(window.localStorage.getItem('savedData'))); 
console.log('TEST : ' + JSON.parse(window.localStorage['savedData'])); 

輸出繼電器:

TEST : [] 
TEST : 
TEST : 

請問有什麼不對?

service.js

.factory('FeedLoader', function ($resource) { 
     return $resource('http://ajax.googleapis.com/ajax/services/feed/load', {}, { 
      fetch: { method: 'JSONP', params: {v: '1.0', callback: 'JSON_CALLBACK'} } 
     }); 
    }) 

.service('FeedList', function ($rootScope, FeedLoader) { 
    var feeds = []; 
    this.get = function() { 
     var feedSources = [ 
      {title: 'rss1', url: 'http://www.website.com/rss/feed/rss_feed_25300'}, 
      {title: 'rss2', url: 'http://www.website.com/rss/feed/rss_feed_10720'}, 
     ]; 
     if (feeds.length === 0) { 
      for (var i=0; i<feedSources.length; i++) { 
       FeedLoader.fetch({q: feedSources[i].url, num: 10}, {}, function (data) { 
        var feed = data.responseData.feed; 
        console.log(feed.entries); 
        feeds.push(feed.entries); 
       }); 
      } 
     } 
     return feeds; 
    }; 
}) 

回答

2

什麼是錯的是FeedList.get()使用異步和$scope.feeds不會被馬上填充。

試試這個:

$scope.feeds = FeedList.get(); 
$scope.feeds.then(function() { 
    // $scope.feeds is done loading now 
    window.localStorage.setItem('savedData', JSON.stringify($scope.feeds)); 

    console.log('TEST : ' + window.localStorage['savedData']); 
    console.log('TEST : ' + JSON.parse(window.localStorage.getItem('savedData'))); 
    console.log('TEST : ' + JSON.parse(window.localStorage['savedData'])); 
}); 

編輯:現在,您所提供的代碼爲您服務,很明顯,它不返回的承諾。你需要做的,爲了讓廣大消費者服務,才能夠等待的結果:

.service('FeedList', function ($rootScope, $q, FeedLoader) { 
    var feeds; 
    this.get = function() { 
     var feedSources = [ 
      {title: 'rss1', url: 'http://www.website.com/rss/feed/rss_feed_25300'}, 
      {title: 'rss2', url: 'http://www.website.com/rss/feed/rss_feed_10720'}, 
     ]; 

     if (!feeds) { 
      var feedPromises = feedSources.map(function (source) { 
       return FeedLoader.fetch({q: source.url, num: 10}, {}).$promise 
       .then(function (data) { 
        return data.responseData.feed.entries; 
       }); 
      }); 

      feeds = $q.all(feedPromises) 
      .then(function (retrievedFeeds) { 
       return Array.prototype.concat([], retrievedFeeds);     
      }); 
     } 
     return feeds; 
    }; 
}) 
+0

我試過並:「TypeError:無法讀取屬性'然後'未定義」。我在我的文章中添加了service.js文件。 – Mezoo

+0

謝謝,我明白我不會像你說的那樣處理異步 – Mezoo

+0

@Mezoo看到你的服務後,我可以看到服務沒有返回任何讓消費者等待結果的東西。請參閱我的更新。這是相當多的代碼要修改而不能測試它,但希望它能工作。 – JLRishe

0

的問題是,你不能正確處理異步請求,所以:

$scope.feeds = []; 

console.log('TEST : Load feeds async'); 

FeedList.get().then(function() { // each feed comes as argument 
    angular.forEach(arguments, function (feed) { 
     $scope.feeds.concat(feed); // merge arrays 
    }); 

    window.localStorage.setItem('savedData', JSON.stringify($scope.feeds)); 

    console.log('TEST : ' + window.localStorage['savedData']); 
    console.log('TEST : ' + JSON.parse(window.localStorage.getItem('savedData'))); 
    console.log('TEST : ' + JSON.parse(window.localStorage['savedData'])); 
}); 

服務:

.service('FeedList', function ($q, $rootScope, FeedLoader) { 
    this.get = function() { 
     var promises = []; // to handle async loading 

     var feedSources = [{ 
      title: 'rss1', 
      url: 'http://www.website.com/rss/feed/rss_feed_25300' 
     }, { 
      title: 'rss2', 
      url: 'http://www.website.com/rss/feed/rss_feed_10720' 
     }]; 

     angular.forEach(feedSources, function (source) { 
      var defer = $q.defer(); 

      FeedLoader.fetch({ 
       q: source.url, 
       num: 10 
      }, {}, function (data) { 
       var feed = data.responseData.feed; 
       defer.resolve(feed.entries); // todo - need to handle errors with 'defer.reject' 
      }); 

      promises.push(defer.promise); 
     }); 

     return $q.all(promises); 
    }; 
}) 
+0

謝謝,我理解異步請求,但結果是:測試:加載飼料async controller.js:18測試:[] controller.js:19測試: controller.js:20測試: – Mezoo

相關問題