我有一个名为Stats
的课程,其中包含secondsPlayed
(数字),createdAt
(日期)和timeScore
(数字)
此类包含数千个对象,但timeScore
列为空。
我想使用列timeScore
(数字),secondsPlayed
(日期)使用公式填充createdAt
列,就像在Excel中一样。公式是:
(secondsPlayed*10^8)/(Date.now()-createdAt.getTime())
正如您所看到的,timeScore
列的值应该每秒都会发生变化,因为Date.now()
和secondsPlayed
是不断变化的变量。
因此我想每5分钟更新并重新填充timeScore
列。这应该会自动发生。
最好的方法是什么?我想使用云代码来计算和填充timeScore
列,然后只需使用简单的Parse查询获取timeScore
列表与将每个设备下载数千个对象并每5个计算和更新进行比较最佳分钟客户端。
我对编写云代码知之甚少,但通过阅读this guide和this SO question,我想出了以下代码。
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
列。这可能吗?
答案 0 :(得分:0)
要从.net客户端进行测试,ParseCloud
提供CallFunctionAsync
。 See the guide for an example here。
您在代码中发现的至少一个问题是查询最多会返回1k个对象,因此查询/更新/保存逻辑每次运行时都必须光标查看Stats
个对象。
经过测试,您需要创建一个Heroku将让您安排的Web工作者。 See their guide about that here
但是我不愿意进一步详细讨论这些问题,因为我不同意这个问题的前提:这个更新应该完成,或者反复进行。
考虑运行此代码不会向系统添加新信息。 createdAt
字段仍然是固定的。这段代码所做的就是产生一种奇怪的方式来表示当前时间(作为创建的时间和自那时起的间隔)每次运行数千次。只有当需要知道给定对象的间隔(now - createdAt)时,才应该这样做。