2015-02-04 2 views
0

을 사용하여 피드를 가져와야합니다. deferred.resolve(feed)을 반환해야 값을 체인화 된 함수 EntryStateUrlService.getEntryStateUrl에 전달해야합니다.맺어진 약속을 수행 할 수 없습니다

어떤 이유에서인지 은 undefined으로 평가되므로 undefined에서 then() 메서드를 호출 할 수 없습니다. 그것을 고치는 방법?

app.service('LoadData', ['FeedService', 'EntryStateUrlService', '$q', function(FeedService, EntryStateUrlService, $q) { 
    var deferred = $q.defer(); 

    this.loadData = function(feedSrc) { 

     FeedService.parseFeed(feedSrc).then(EntryStateUrlService.getEntryStateUrl).then(function(urls) { 
      $rootScope.links = urls; 
     }); 
    } 
}]); //TypeError: undefined is not a function 

app.service('FeedService', function($http, $q) { 
    var deferred = $q.defer(); 

    this.parseFeed = function(url) { 
     $http.jsonp('//ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=JSON_CALLBACK&q=' + encodeURIComponent(url)) 
      .success(function(res) { 

       deferred.resolve(res.data.responseData.feed.entries); //TypeError: Cannot read property 'responseData' of undefined 
      }).error(function() { 
       deferred.reject(); 
      }); 
return deferred.promise(); //TypeError: object is not a function 
    } 
}); 
app.service('EntryStateUrlService', ['$state', '$q', function($state, $q) { 
    var deferred = $q.defer(); 
    this.getEntryStateUrl = function(feeds) { 
      var idx = 0; 
      feeds.forEach(function(e) { 
       $http.jsonp(e.link).success(function(data) { 
        /*stuff*/ 
        deferred.resolve('root.' + generatedStateName); 
       }); 
      }); //forEach 
     } //getEntryStateUrl 
return deferred.promise(); 
}]); //EntryStateUrlService 

UPDATE

EntryStateUrlServiceFeedServicereturn deferred.promise();을 모두 추가 한 후 나는 FeedServicereturn deferred.promise();에 대한 TypeError: object is not a function을 얻고있다.

+0

[지연된 반 패턴] (http://stackoverflow.com/q/23803743/1048572)을 사용하지 마십시오! – Bergi

답변

1

의 : 난 당신이 FeedService 안에 약속을 반환해야 생각 일단 모든 서비스가 완료되면 아래와 같이 $ q.all을 사용하십시오.

app.service('LoadData', ['FeedService', 'EntryStateUrlService', '$q', function(FeedService, EntryStateUrlService, $q) { 
    this.loadData = function(feedSrc) { 

     FeedService.parseFeed(feedSrc).then(EntryStateUrlService.getEntryStateUrl).then(function(urls) { 
      $rootScope.links = urls; 
     }, function(failureException) { 
      // failure error handler comes here.   
     }); 
    } 
}]); //TypeError: undefined is not a function 

app.service('FeedService', function($http, $q) { 

    this.parseFeed = function(url) { 
     var deferred = $q.defer(); 
     $http.jsonp('//ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=JSON_CALLBACK&q=' + encodeURIComponent(url)) 
      .success(function(res) { 

       deferred.resolve(res.data.responseData.feed.entries); //TypeError: Cannot read property 'responseData' of undefined 
      }).error(function() { 
       deferred.reject(); 
      }); 
     return deferred.promise; 
    } 
}); 
app.service('EntryStateUrlService', ['$state', '$q', function($state, $q) { 

    this.getEntryStateUrl = function(feeds) { 

      var deferred = $q.defer(); 
      var idx = 0, promises = []; 
      feeds.forEach(function(e) { 
       $http.jsonp(e.link).success(function(data) { 
        /*stuff*/      
       }); 
      }); //forEach 

      // once all the jsonp service in the for loop is finished, then resolve the promise 
      $q.all(promises).then(function() { 
       deferred.resolve('root.' + generatedStateName); 
      }, deferred.reject); 

      return deferred.promise; 

     } //getEntryStateUrl 
}]); //EntryStateUrlService 
+0

'feeds.forEach'주기 중 내 약속 중 하나가 오류로 끝납니다. 왜냐하면'LoadData'에서'$ rootScope.links = urls; '라인이'then' 안에 실행되지 않았기 때문일 것입니다. 그것을 고치는 방법? –

+0

예. 우리는 $ q.foreach를 사용하고 있기 때문에 실패한 feedEforEachEnds 중 하나라도 성공한 경우 콜백을 실행하지 않고 실패 호출을 실행합니다. 오류 조건을 처리하기위한 업데이트 된 코드 –

0

parseFeed 지연된 함수를 반환해야합니까?

this.parseFeed = function(url) { 
    $http.jsonp('//ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=JSON_CALLBACK&q=' + encodeURIComponent(url)) 
     .success(function(res) { 

      deferred.resolve(res.data.responseData.feed.entries); 
     }).error(function() { 
      deferred.reject(); 
     }); 
    return deferred; 
} 
+0

'return deferred;하지만 동일한 2 개의 에러가 지속됩니다 :'TypeError : 'undefined'의'responseData '속성과'TypeError : undefined is not function'을 읽을 수 없습니다. 코드 업데이트를 참조하십시오 .... –

+0

EntryStateUrlService로 돌아 가기? –

+0

예, 업데이트를 참조하십시오 –

0

코드에 약속이 없습니다. 약속이 해결해야하므로 경우, foreach 문에 여러 서비스를 호출의 EntryStateUrlService에 또한, deferred.promise을 반환 return deferred.promise(); 대신 FeedService에서 return deferred;