Как я могу сделать угловой код обслуживания «смотреть синхронно»?Angularjs: как я могу сделать код обслуживания «смотреть синхронно»?
Мои вопросы возникли, когда я очистил контроллер и поместил код бизнес-логики в службу. Все идет нормально. Теперь я хотел бы «подождать» в службе, пока все асинхронные вызовы не вернутся и затем. Как я могу это сделать?
Чтобы проиллюстрировать мою проблему, предположим, что у вас есть код контроллера, который просто:
- запросов некоторые данные из внутреннего интерфейса
- делает некоторую обработку с данными и
- руки данные через к области
Как что:
Dat аСопЬгоНег перед тем рефакторинга:
$scope.submitForm = function() {
RestBackend.query('something').then(function(data) {
// do some additional things ...
...
$scope.data = data;
});
};
Довольно просто. Извлечь данные и заполнить область.
После рефакторинга в контроллер + службы, я закончил с:
DataController реорганизованным:
$scope.submitForm = function() {
DataService.getData().then(function(data) {
$scope.data = data;
});
};
DataService рефакторингу:
this.query = function() {
var dataDefer = $q.defer();
RestBackend.query('something').then(function(data) {
// do some additional things ...
...
dataDefer.resolve(data);
});
return dataDefer.promise;
};
Мне не нравится тот факт, что я также должны работать с обещанием в контроллере. Мне нравятся обещания, но я хочу сохранить агностик контроллера этой «детали реализации» службы. Это то, что я хотел бы код контроллера выглядеть следующим образом:
DataController (как это должно быть):
$scope.submitForm = function() {
$scope.data = DataService.getData();
};
Вы получите точку? В контроллере я не хочу заботиться о обещании или нет. Просто подождите, пока данные будут извлечены, а затем используйте их. Таким образом, я искал возможность для реализации сервиса, как это:
- запроса данных (асинхронно)
- не возвращают, пока данные не были неправдоподобным
- возвращения извлеченной данные
Теперь пункт 2. не ясен для меня: как я могу «дождаться получения данных» и только потом продолжить? Цель состоит в том, что функция сервиса выглядит синхронно.
Вы используете 'ngRoute' в своем проекте? – meriadec
Я думаю, что у вас есть очень хорошее решение. Вам не нужно ждать, пока обещание будет разрешено, оно побеждает цель асинхронного javascript. Просто спросите себя, почему вам нужно запустить синхронизацию? Переместил мой комментарий в ответ – Tim
@meriadec: да, я использую ngRoute ... но почему вы спрашиваете? – andimeier