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