Асинхронный поиск данных в angularjs

0

У меня проблема async в моем приложении angularjs.

Я хочу, чтобы получить данные с удаленного сервера (в prefsService.js). А затем присвойте значения данных переменным в контроллере (в prefsController.js).

Вот файл prefsService.js:

 (function() {
  'use strict';

  angular
    .module('app')
    .factory('PrefsService', PrefsService);

  PrefsService.$inject = ['$resource','PrefsResource'];

  function PrefsService($resource,PrefsResource) {

    var initialize = function() {
      var twentyFourHourTime = null;
      var decimalTime = null;
      var startDayOfWeek = null;
      var roundingOption = null;
      var roundingIncrement = null;

      PrefsResource.get({key:"TwentyFourHourTime"}, function(data) {
        if (data.result.value === null||undefined) {
            twentyFourHourTime = 0;
        } else {
            twentyFourHourTime = data.result.value;
        }
            PrefsResource.get({key:"DecimalTime"}, function(data) {
              if (data.result.value === null||undefined) {
                  decimalTime = 0;
              } else {
                  decimalTime = data.result.value;
              }
                  PrefsResource.get({key:"startDayOfWeek"}, function(data) {
                    if (data.result.value === null||undefined) {
                        startDayOfWeek = 0;
                    } else {
                        startDayOfWeek = data.result.value;
                    }

                    return {"twentyFourHourTime":twentyFourHourTime,"decimalTime":decimalTime,"startDayOfWeek":startDayOfWeek}
              });
            });
      });


    };

    return {
      initialize: initialize
    };

  }

})();

Вот файл prefsController.js:

vm.test=PrefsService.initialize();
console.log('Prefs data initialized', vm.test);

Когда я запускаю его, vm.test всегда "неопределен".

Что мне делать? Спасибо!

  • 0
    Почему вы делаете ваши AJAX-вызовы последовательно, когда они не зависят друг от друга?
  • 0
    И почему вы делаете их на фабрике? На фабрике вы определяете ресурс, который будет использоваться в контроллере для получения / запроса / публикации / размещения / и т.д ...
Показать ещё 1 комментарий
Теги:
web

1 ответ

2
Лучший ответ

Я не проверял синтаксис, но суть его, как и при любом асинхронном программировании, является обещанием. Этот вопрос является обманом (кто может когда-либо найти главный обман этого типа вопроса?), Но здесь, как это сделать, используя угловые:

 (function() {
  'use strict';

  angular
    .module('app')
    .factory('PrefsService', PrefsService);

  PrefsService.$inject = ['$resource','PrefsResource'];

  function PrefsService($resource,PrefsResource) {

    var initialize = function() {

      //return a promise
      return $q
        .all([
          PrefsResource.get({key:"TwentyFourHourTime"}),
          PrefsResource.get({key:"DecimalTime"}),
          PrefsResource.get({key:"startDayOfWeek"})
        ])
        .then(function(values) {
          var 
            twentyFourHourTime = values[0],
            decimalTime = values[1],
            startDayOfWeek = values[2];

          //return the value (object) when all promises have resolved
          return {
            "twentyFourHourTime":twentyFourHourTime.result.value || 0,
            "decimalTime":decimalTime.result.value || 0,
            "startDayOfWeek":startDayOfWeek.result.value || 0
          }
        })
    }


    return {
      initialize: initialize
    };

  }

})();


PrefsService
  .initialize()
  //use the promise API to log messages only after the promise has resolved
  .then(function(prefs) {
    console.log('initialized');
    console.log(prefs);
  })
  • 0
    Спасибо. Но, похоже, можно получить только значение TwentyFourHourTime. Другими словами, переменная «values» содержит только объект «TwentyFourHourTime»
  • 0
    Он возвращает {"values": {"$ resolved": false, "$ обещание": {"status": "ok", "result": {"key": "TwentyFourHourTime", "value": null}}} }
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню