Parse Server автоматически заполняет и обновляет столбец с облачным кодом

Murat Kaya спросил: 10 мая 2018 в 04:33 в: javascript

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

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

p> Я хочу заполнить столбец timeScore формулой, используя столбцы secondsPlayed (number), createdAt (date), как вы делали бы в 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 ответ

Есть решение
danh ответил: 12 мая 2018 в 05:19

Чтобы протестировать клиент .net, ParseCloud предоставляет CallFunctionAsync. См. Руководство для примера.

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

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

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

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

Murat Kaya ответил: 13 мая 2018 в 07:43
Привет, спасибо за ответ. Я не понимаю, зачем мне проверять или запускать код с клиентской стороны. Я просто хочу заполнить столбец C, используя столбцы A и B. Я не возвращаю данные клиенту, и то, что я делаю, не имеет ничего общего с клиентом. Нужно ли вообще запускать код, не вызывая его у клиента? Мне действительно не нужно запрашивать, поскольку я хочу, чтобы каждая строка столбца C была заполнена. Поэтому мне нужно запустить код для каждого объекта. Будет ли у меня еще проблема 1k?
Murat Kaya ответил: 13 мая 2018 в 07:43
То, что я вычисляю, - это оценка, как у вас в игре. Если пользователь не играет (secondsPlayed) не меняется, но время проходит (Date.now () - createdAt.getTime ()), счет пользователей уменьшается. Мне нужно обновить счет пользователей каждые 5 минут.
danh ответил: 13 мая 2018 в 09:40
Как и когда пользователь видит ее счет? Это мое мнение о том, где и когда вы будете делать этот расчет. Подумайте об этом: если задание на стороне сервера выполняется каждые пять минут, в любой момент оценки каждого игрока ошибочны в среднем на 2,5 минуты.
danh ответил: 13 мая 2018 в 09:45
Извините, BTW, за смешение о вызове от клиента. Я неправильно понял строку "Нужно ли мне называть ее из приложения xamarin?" как вопрос о том, как вызвать его из .NET-клиента. Вы можете просто принять и использовать cron для повторного вызова. Версия Героку - это "запланированный рабочий". Что касается запуска его без получения клиентом / пользователем результата, см. En.wikipedia.org/wiki/If_a_tree_falls_in_a_forest
Murat Kaya ответил: 14 мая 2018 в 09:57
Привет, пользователь увидит их результат каждый раз, когда они открывают экран с высокими показателями. Если бы я мог заполнить серверную сторону столбца C, клиент увидит данные с простым анализом запросов, который отобразит 100 лучших значений столбца C. Оценки округляются до ближайшего целого числа, поэтому 5 минут фактически не влияют на оценку, поскольку ( Date.now () - createdAt.getTime ()) может составлять месяцы или даже годы. Нет смысла запускать код каждую секунду. Но если у меня не будет никаких негативных последствий, я могу это сделать.