Parse Server автоматически заполняет и обновляет столбец с помощью облачного кода - PullRequest
0 голосов
/ 03 июня 2018

У меня есть класс Stats, который содержит столбцы secondsPlayed (число), createdAt (дата) и timeScore (число)

Этот класс содержит тысячи объектов, но timeScore столбец пуст.

Я хочу заполнить столбец timeScore формулой, используя столбцы secondsPlayed (число), createdAt (дата), как это было бы в Excel.Формула:

(secondsPlayed*10^8)/(Date.now()-createdAt.getTime())

Как видите, значения столбца timeScore должны меняться каждую секунду, поскольку Date.now() и secondsPlayed - переменные, которые постоянно меняются.

Из-за этого я хочу обновлять и заполнять столбец timeScore каждые 5 минут.Это должно произойти автоматически.

Каков наилучший способ сделать это?Я подумал, что использование облачного кода для вычисления и заполнения столбца timeScore, а затем просто получить список timeScore с простым запросом Parse будет лучше, чем загрузка тысяч объектов на каждое устройство и вычисление и обновление каждые 5 минут на стороне клиента.

Я не знаю много о написании облачного кода, но прочитав это руководство и этот вопрос SO Я придумал следующий код.

const _ = require("underscore");
Parse.Cloud.define("timeScore", function(request, response) {
  const query = new Parse.Query("Stats");
  const maxSeconds = (Date.now() - new Date('2017-12-12T06:00:04.022Z').getTime())/1000;
  query.lessThan("secondsPlayed", maxSeconds);
  query.find().then(function(results) => {
        _.each(results, function(result) {
            var secondsPlayed = result.get("secondsPlayed") || 0;
            var createdAt = result.get("createdAt") || new Date('2017-12-12T06:00:04.022Z');
            result.set("timeScore", (secondsPlayed*100000000)/(Date.now()-createdAt.getTime()));
      });
        return Parse.Object.saveAll(results);
    }).then(function(results) {
        response.success(results);
    }, function(error) {
        response.error(error);
    })
    .catch(() =>  {
      response.error("FAILED");
    });
});

Я не знаю, что делать с этим кодом.Я не знаю, как это проверить или даже если это работает.Как мне поступить?

Нужно ли звонить из приложения xamarin?Мне просто нужно, чтобы столбец заполнялся и обновлялся каждые 5 минут в соответствии с кодом.Мне не нужно вызывать облачный код из приложения.Я просто хочу запросить столбец timeScore из приложения.Это возможно?

1 Ответ

0 голосов
/ 05 июня 2018

Для тестирования из .net-клиента ParseCloud предоставляет CallFunctionAsync. См. Руководство для примера здесь .

По крайней мере одна проблема, с которой вы столкнетесь с кодом, состоит в том, что запрос будет возвращать максимум 1 тыс. Объектов, поэтому логика запроса / обновления / сохранения должна будет перемещаться по объектам Stats при каждом запуске.

После тестирования вам нужно будет создать веб-работника, который Heroku позволит вам запланировать. См. Их руководство об этом здесь .

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

Учтите, что выполнение этого кода не добавляет новую информацию в систему.Поле createdAt остается фиксированным.Все, что делает этот код, это производит странный способ представления текущего времени (как созданное время и интервал с тех пор) тысячи раз за цикл.Это именно то, что должно быть сделано только тогда, когда этот интервал (сейчас - созданAt) должен быть известен для данного объекта.

...