2014-09-25 225 views
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"); 

}); 

回答

2

您需要return承諾從真正絕對功能做一些事情異步。在你的情況下,你放棄了query.find()返回的承諾,並立即撥打pet.save()。我想你想鏈接他們。

此外,您的userPromise從未解決,這可能是您的連鎖店失敗的原因。而你的pushPromises數組是完全沒有必要的,因爲它只包含至多一個承諾。

此外,我使用_.map而不是推到陣列,並刪除了您使用過的deferred antipattern。它使得returns更加突出,所以如果你忘記了它就更容易發現。

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); 
    return petQuery.find().then(function(pets) { 
     return Parse.Promise.when(_.map(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) { 
       return Parse.Promise.when(_.map(users, function(user) { 
        console.log("check user " + user.id + " with pet: " + pet.id); 

        if (petLocation.kilometersTo(user.get("lastLocation")) <= user.get("pushRadius")) { 
         console.log("send push to" + user.id); 
         return 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) 
          } 
         }); // we already got a promise here! 
        } else 
         return null; 
       })); 
      }).then(function() { 
       return pet.save(); 
      }); 
     })); 
    }).then(function() { 
     status.success("location Send complete"); 
    }, function(error) { 
     status.error("location Send Error"); 
    }); 
}); 
+0

感謝您的時間,非常感謝。 不幸的是,它現在只是檢查寵物,而不是相應的用戶。 日誌:I2014-09-25T15:10:3​​1.730Z]檢查寵物:KchBVkPE15 I2014-09-25T15:10:3​​1.749Z]檢查寵物:VhfuUdOgT0 它應該檢查寵物誰的推送尚未發送initialPushSent = false),檢查範圍內(50km)的用戶,向他們發送推送通知並將寵物的initialPushSent設置爲true。這就是pet.save()的原因 - 爲了調試的原因,我已經刪除了現在保存狀態的行。 – Patrick 2014-09-25 15:17:03

+0

呃,我只是修正了'Parse.Push.send',我忘了自己的'return'。我不確定'Parse'是如何工作的,但即使你忘了返回一個承諾(這樣它就不會等待),它仍然應該執行你的動作 - 除非出現問題並且成功回調從不被調用。您將需要安裝至少一個錯誤處理程序(使'status.error'爲'console.log')。如果它不檢查用戶,請執行'console.log(users)'查看有多少人被發現。順便說一句,我沒有看到你的代碼將'initialPushSent'設置爲true - 只有'.save()'。 – Bergi 2014-09-25 15:29:02