2014-09-23 2 views
1

У меня есть очень простая проблема, которую я не могу понять. Я использую AngularJS и Firebase в качестве бэкэнд.Вызов функции один раз в день изменение

В принципе, у меня есть функция, которую я хочу запускать один раз, каждый день, в полночь, чтобы выполнить сброс значения (установите для некоторых свойств объекта значение false и т. Д.). Функция работает нормально, когда я запускаю ее вручную и работает точно так, как предполагалось.

Однако я не могу заставить его автоматически запускаться при смене дня.

Функция, которую я хочу запустить в полночь, раз в день Fed.newDay(). Он вводится через Fed завод моей Dte завода - который держит обновленный объект с днями недели, месяц и т.д.

В настоящее время, на мой Dte заводе у меня есть следующий объект:

var date = new Date();  

var Dte = { 

      currentDate: function() { 
       ref.update({date: date.getDate()}); 

       ref.on('child_changed', function(snapshot) { 
        console.log('Dte registered new Day'); 
        Fed.newDay(); 
       }); 

       return date.getDate(); 
      }, 
} 

Цель здесь - запустить Fed.newDay() один раз при изменении даты. Я хранить даты в Firebase следующим образом: harrison -> date -> date: 23

Мое предположение было то, что каждый раз, когда дата была обновлена ​​на сервере, то функция будет работать на основе метода ref.on('child_changed')... Firebase в. Когда I .set значение вручную, функция работает как ожидалось, но не будет работать в одночасье при автоматическом изменении дня.

Я также пробовал использовать setInterval и setTimeout для запуска функции каждые 86400000 миллисекунд (1 день). Я не думаю, что они запускаются, когда приложение не выполняется.

Должно быть что-то, что я здесь просматриваю. Спасибо за ваше время и помощь.

Update:

Просто для уточнения.

Это то, что я пытаюсь сделать:

У меня есть две галочки, отмечающие завершение задачи, которая должна быть сделана группой людей, пользователей. Эти две задачи нужно выполнять только один раз, одним и только одним пользователем, один раз в день. По прошествии этого дня я хочу очистить их значения (установить их в false), чтобы один и тот же человек или другой человек мог проверить любой из двух полей.

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

Решение:

Благодаря @bmceldowney за помощь.

Это решение, к которому я пришел. Кроме того, см. Правильный ответ ниже, чтобы избежать проблем, которые могут возникнуть, если несколько пользователей вошли в систему в 11:59.

var Dte = { 

     currentDate: function() { 
      dateRef.update({date: date.getDate()}); 
      return date.getDate(); 
     }, 

     setLastUpdated: function(day) { 
      dateRef.set({lastUpdated: day}); 
     }, 

     compareReset: function(last) { 
      var current = Dte.currentDate(); 
      if (last !== current) { 
       Fed.newDay(); 
       Dte.setLastUpdated(current); 
      } else { 
       console.log('no reset needed'); 
      } 
     }, 

     load: function() { 
      dateRef.on('value', function(snapshot) { 
       if (snapshot.val() != null) { 
        var data = snapshot.val(); 
        var updateValue = data['lastUpdated']; 
        Dte.compareReset(updateValue); 
       } else { 
        Dte.load(); 
       } 
      }) 
     }, 
+0

Вы хотите получить полночное местное время пользователя или полночь GMT? – TheSharpieOne

+0

Полуночное местное время пользователя, GMT-6, КНТ. – Himmel

+0

Вы говорите, что 'setInterval' не является опцией, потому что они не будут работать, когда приложение не будет запущено. Это будет проблемой для любого решения, выполняемого на клиенте. – bmceldowney

ответ

4

Вы можете сохранить поле lastUpdated в firebase.При загрузке клиента возьмите значение lastUpdated и сравните его с текущей датой. Если все по-другому, запустите свой метод Fed.newDay и обновите дату lastUpdated.

EDIT:

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

+0

Это звучит как правильное решение. Спасибо. Я собираюсь попытаться реализовать его, и я последую за ним. – Himmel

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