2013-11-29 2 views
0

Как я могу вернуть корень из этого вызова API на этой фабрике? Теперь это не определено. Я понимаю, что это связано с тем, что вызов ajax является асинхронным, но как его ждать?

app.factory('ApiFactory', ['$resource', function($resource) { 
    return $resource('http://localhost:8080/rest/forum/categories/:categoryId', { bookId: '@categoryId' }, { }); 
}]); 


app.factory('ApiParser', ['ApiFactory', function(ApiFactory) { 

    function createSubjectArray(children){ 
     var subjets = [], 
      node, 
      subject, i; 
     for(i = 0; i < children.length ; i++){ 
      node = children[i]; 
      subject = {}; 
      subject.text = node.value.nameKey; 

      if(!node.leaf){ 
       subject.items = createSubjectArray(node.children); 
      } else { 
       subject.spriteCssClass = "subject"; 
      } 
      subjets.push(subject); 
     }  
     return subjets; 
    } 


    return { 
     get: function() { 
      var root 
      var data = ApiFactory.get({categoryId : 1},function(data) { 
       root = { text: data.value.nameKey, expanded: true, items: createSubjectArray(data.children)}; 

      }); 

      return root; 
     } 
    } 
}]); 
+0

возможно дубликат [Как вернуть ответ от AJAX позвонить?] (HTTP: // stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) – Stewie

ответ

0

Вы можете использовать $ Q услуги:

app.factory('ApiParser', ['ApiFactory','$q', function(ApiFactory, $q) { 

... 

return { 
    get: function() { 
     var defer = $q.defer(); 
     var root; 
     var data = ApiFactory.get({categoryId : 1},function(data) { 
      root = { text: data.value.nameKey, expanded: true, items: createSubjectArray(data.children)}; 

      defer.resolve(root); 

     }, function(data, status) { defer.reject(status); }); 

     return defer.promise; 
    } 
} 
}]); 

и использование:

ApiParser.get().then(function(data){ $scope.root = data; }, function(status) { // error logic }); 
Смежные вопросы