2015-04-04 5 views
2

Я пишу угловое приложение, и Угловое очень упрямо относится к разрыву проблем.Функция обратного вызова после назначения

У меня есть контроллер и служба, и я не хочу, чтобы мой код прерывал разделение проблем.

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

Вот jsfiddle, который показывает его:

http://jsfiddle.net/yak2m1ve/

Теперь имейте в виду, что я пытаюсь найти элегантное решение, которое не нарушает SoC - не грязный хак, чтобы заставить его работать.

//controller 
var x = fn1(); 
var y = fn2(x); 

alert(y); 

//service 
function fn1(){ 
    setTimeout(function(){ 
     return '123'; //web request example 
    }, 1000); 
} 

function fn2(code){ 
    return 'asdfb' + code; 
} 

ответ

1

Плункер, хотя и представляет проблему с точки зрения вызовов обычной функции, очевидно, что вместо этого вы будете совершать вызовы веб-сервисов.

Вам, в данном случае, необходимо использовать Angular Promise API.

Например, предположим, что вы должны выполнить следующую последовательность операций.

  1. Извлечение информации о фильме.

  2. Извлеките это звездное литье.

  3. Назначить ответ переменной Scope.

В вашей службе, вы будете иметь

this.getMovie = function(movie) { 
     return $http.get('/api/v1/movies/' + movie) 
       .then(
        function (response) { 
        return { 
         title: response.data.title, 
         cost: response.data.price 
        }); 
        }); 
    }; 

    this.starCast = function(movie) { 
     return $http.get('/api/v1/movies/' + movie) 
       .then(
        function (response) { 
        return { 
         title: response.data.title, 
         cost: response.data.price 
        }); 
        }); 
    }; 

И в контроллере:

$scope.getMovie = function(movie) { 
     service.getMovie(movie) 
     .then(function(movieData) { 
      service.getStarCast(movieData).then(function(response) { 
       $scope.starCast = response; 
      }); 
     }); 
    }; 
+0

Удивительный ответ спасибо – Jamesla

+0

Рад, что помог (у). –

Смежные вопросы