我在back4app上托管了一个Parse Server应用,并且我正在运行每分钟运行的后台作业,并查询Letters
类,其中deliveryDate
列较少或等于当前日期,这是我的 main.js 文件:
// DELIVER A LETTER
Parse.Cloud.job("deliverLetter", function (request, status) {
var now = new Date();
// var nowTime = date.getTime();
var Letters = Parse.Object.extend("Letters");
var query = new Parse.Query(Letters);
query.lessThanOrEqualTo("deliveryDate", now);
query.find().then (function (objects) {
objects.forEach(function (obj) {
obj.set("isDelivered", true);
Parse.Cloud.useMasterKey();
obj.save(null, { useMasterKey: true } ).then(function(obj) {
response.success(obj);
}, function(error) {
response.error(error)
});
});
});
例如,我在deliveryDate
设置为昨天的Letters类中保存了一行,以便我测试此Cloud Code函数。还有另一列称为isDelivered
,并将其设置为False。因此,我上面的函数应将isDelivered
设置为True并更新Letters
的对象。
但是它不起作用,所以我不知道我在做什么错。
由于danh
,我已修复了如下代码:
var Letters = Parse.Object.extend("Letters");
var query = new Parse.Query(Letters);
query.lessThanOrEqualTo("deliveryDate", now);
query.equalTo("isDelivered", false);
query.find().then (function (objects) {
let savePromises = objects.map(function (obj) {
obj.set("isDelivered", true);
return obj.save(null, { useMasterKey: true } );
});
Promise.all(savePromises).then(function(obj) {
response.success(obj);
}, function(error) {
response.error(error)
});
});
我需要从main.js文件中调用另一个函数,该函数发送推送通知并需要一些参数。我通常从我的应用程序中调用它,如何从上述函数中调用它?
Parse.Cloud.define("pushiOS", function(request, response) {
var user = request.user;
var params = request.params;
var userObjectID = params.userObjectID
var data = params.data
var recipientUser = new Parse.User();
recipientUser.id = userObjectID;
var pushQuery = new Parse.Query(Parse.Installation);
pushQuery.equalTo("userID", userObjectID);
Parse.Push.send({
where: pushQuery,
data: data
}, { success: function() {
console.log("#### PUSH SENT!");
}, error: function(error) {
console.log("#### PUSH ERROR: " + error.message);
}, useMasterKey: true});
response.success('success');
});
也许进入Promise.all()?
Promise.all(savePromises).then(function(obj) {
response.success(obj);
Parse.Cloud.define("pushiOS"...
}, function(error) {
response.error(error)
});
答案 0 :(得分:1)
调用save()
时任何正在进行的或尚未启动的response.success()
都将被终止(或没有机会启动)。要进行修复,请收集所有保存的承诺,然后与Promise.all()
一起运行,query.find().then (function (objects) {
// Parse.Cloud.useMasterKey(); don't need this
let savePromises = objects.map(function (obj) {
obj.set("isDelivered", true);
return obj.save(null, { useMasterKey: true } );
});
Promise.all(savePromises).then(function(obj) {
response.success(obj);
}, function(error) {
response.error(error)
});
});
仅在传递给它的所有承诺都解决后才能解决。
query.lessThanOrEqualTo("deliveryDate", now);
此外,请注意,query.lessThanOrEqualTo("deliveryDate", now);
query.equalTo("isDelivered", false);
将在此之前获得所有带有deliveryDate的对象,包括您先前处理过的对象。随着时间的推移,该结果将单调地变长,最终在两次运行之间超过1分钟,或者消耗其他系统资源。
也许你真的想要...
function pushDataToUser(userID, data)
var recipientUser = new Parse.User();
recipientUser.id = userID;
let pushQuery = new Parse.Query(Parse.Installation);
pushQuery.equalTo("userID", userID);
return Parse.Push.send({ where:pushQuery, data:data });
}
编辑
第二个问题可以通过分解像这样的promise-returning push函数来解决。
Parse.Cloud.define("pushiOS", function(request, response) {
let params = request.params;
pushDataToUser(params.userObjectID, params.data).then(function() {
console.log("#### PUSH SENT!");
response.success('success');
}, function(error) {
console.log("#### PUSH ERROR! " + JSON.stringify(error));
response.error(error);
});
}
可以从这样的云代码中调用...
// function doSomething() returns a promise (like from a find() or a save()
return doSomething().then(function() {
// initialize someId and someData
return pushDataToUser(someId, someData)
});
...并且新的承诺返回功能可以像这样添加到任何其他承诺链中...
{{1}}