0
我想通过解析后台作业发送推送通知给我的用户,如果他们在创建的宠物附近。解析云代码 - 承诺
范围内的每个用户都会与宠物进行交叉检查(通过日志确认),但推送通知会发送给错误的用户或大部分时间根本不会发送。我很确定我弄坏了承诺,但不能解决问题。
任何帮助将不胜感激,谢谢!
Parse.Cloud.job("locationPush", function(request, status) {
Parse.Cloud.useMasterKey();
var Pet = Parse.Object.extend("Pet");
var petQuery = new Parse.Query(Pet);
petQuery.equalTo("initialPushSent", false);
petQuery.equalTo("status", "missing");
petQuery.equalTo("deleted", false);
petQuery.find().then(function(pets) {
var petPromises = [];
_.each(pets, function(pet) {
console.log("checking pet: " + pet.id);
var petLocation = pet.get("lastSeenLocation");
var query = new Parse.Query(Parse.User);
query.withinKilometers("lastLocation", petLocation, 50);
query.find().then(function(users) {
var userPromises = [];
_.each(users, function(user) {
var userPromise = new Parse.Promise();
userPromises.push(userPromise);
console.log("check user " + user.id + " with pet: " + pet.id);
var pushPromises = [];
if(petLocation.kilometersTo(user.get("lastLocation")) <= user.get("pushRadius")){
console.log("send push to" + user.id);
var promise = new Parse.Promise();
pushPromises.push(promise);
Parse.Push.send({
channels: [ "user_" + user.id ],
data: {
alert : "Neues vermisstes Tier im Umkreis"
}},
{ success: function() {
console.log("push sent to: " + user.id)
},
error: function(error) {
console.log("error sending push: " + error)
}}).then (function(result){
promise.resolve();
}, function(error) {
promise.reject();
});
}
return Parse.Promise.when(pushPromises);
});
return Parse.Promise.when(userPromises);
});
petPromises.push(pet.save());
});
return Parse.Promise.when(petPromises);
}).then(function() {
status.success("location Send complete");
}, function(error) {
status.error("location Send Error");
});
感谢您的时间,非常感谢。 不幸的是,它现在只是检查宠物,而不是相应的用户。 日志:I2014-09-25T15:10:31.730Z]检查宠物:KchBVkPE15 I2014-09-25T15:10:31.749Z]检查宠物:VhfuUdOgT0 它应该检查宠物谁的推送尚未发送initialPushSent = false),检查范围内(50km)的用户,向他们发送推送通知并将宠物的initialPushSent设置为true。这就是pet.save()的原因 - 为了调试的原因,我已经删除了现在保存状态的行。 – Patrick 2014-09-25 15:17:03
呃,我只是修正了'Parse.Push.send',我忘了自己的'return'。我不确定'Parse'是如何工作的,但即使你忘了返回一个承诺(这样它就不会等待),它仍然应该执行你的动作 - 除非出现问题并且成功回调从不被调用。您将需要安装至少一个错误处理程序(使'status.error'为'console.log')。如果它不检查用户,请执行'console.log(users)'查看有多少人被发现。顺便说一句,我没有看到你的代码将'initialPushSent'设置为true - 只有'.save()'。 – Bergi 2014-09-25 15:29:02