1

вот моя проблема:

У меня есть служба, созданная с $ resource и контроллером; контроллер вызывает службу, и я пытаюсь установить значение после ответа (на самом деле ошибка). Проблема в том, что я пытаюсь установить это значение вне обратного вызова. Вот этот сервис:

app.factory("DataService", function ($resource, ENV) { 
    return $resource(ENV.apiEndpoint + "/endpoint/:id", {id:'@id'}, { 
     update: { method: 'PUT' } 
    }); 
}); 

Это простой сервис, который извлекает данные из бэкэнд через конечную точку REST.

Вот контроллер:

app.controller("DataController", function (DataService){ 
    var ctrl = this; 
    ctrl.initialData = undefined; 
    ctrl.data = undefined; 

    ctrl.initData = function() { 
     ctrl.getData(); 
     ctrl.data = ctrl.initialData; 
    }; 

    ctrl.getData = function() { 
     DataService.get({}, 
      function (response) { 
       ctrl.initialData = response.content; 
     }, function (error) { 
       ctrl.initialData = { data1: "A" }; 
     }); 
    }; 
}); 

Angular $resource Doc говорит вызов метода Get() таким образом:

Методы действия на объект класса или объект экземпляра может быть требо следующие параметры:

HTTP GET "class" actions: Resource.action([parameters], [success], [error]) 

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

Моя проблема в том, что я по-прежнему не очень-то привык к обещаниям. Я понимаю, что ответ от DataService является асинхронным. Поэтому я попытался установить данные несколькими способами без успеха. Я пробовал:

  • Для замены метода initData с:

    Но я никогда не войти в 'поймать' состояние;

  • Чтобы использовать $ Q услуги:

    ctrl.initData = function() { 
        $q.all([ctrl.getData()]).then(function() { 
         ctrl.data = ctrl.initialData; 
        }); 
    }; 
    
  • Чтобы использовать $q.when создать обещание от переменной ctrl.data:

    ctrl.billingInfo = $q.when(/*???*/); 
    
  • Другие варианты тех ..

Я мог бы заставить его работать, установив data непосредственно в функции обратного вызова, но тогда это означает, что я сбросить данные каждый раз, когда я называю метод getData(), и это то, что я хочу, чтобы избежать для наилучшей практики назначения:

ctrl.getData = function() { 
    DataService.get({}, 
     function (response) { 
      ctrl.initialData = response.content; 
      ctrl.data = ctrl.initialData; 
    }, function (error) { 
      ctrl.initialData = { data1: "A" }; 
      ctrl.data = ctrl.initialData; 
    }); 
}; 

Есть ли способ, чтобы ждать, что ctrl.initialData был установлен до установки ctrl.data?

Любая небольшая помощь очень ценится

+1

ваш 'GetData 'теперь ничего не возвращаю, поэтому вы можете использовать его с' $ q' и т. д., а также ресурсы в угловом имеют свойство '$ prom', что вы можете использовать – Grundy

+0

вам нужно t o передавать аргумент, такой как res или data, хотя ваши обещания - это представление возвращаемого значения предыдущего оператора –

ответ

2

Вы можете немного исправить вам getData функцию, чтобы вернуть Promise

ctrl.getData = function() { 
    return DataService.get({}).$promise.then(
     function(response) { 
      return ctrl.initialData = response.content; 
     }, 
     function(error) { 
      return ctrl.initialData = { data1: "A" }; 
     }); 
}; 

, а затем вы можете использовать его с then как

ctrl.initData = function() { 
    ctrl.getData().then(function(initialData){ 
     //success callback 
     ctrl.data = initialData; 
    },function(initialData){ 
     //error callback 
     ctrl.data = initialData; 
    }); 
}; 
+0

Спасибо, он работает! – LeMiniMoine

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

  • Нет связанных вопросов^_^