2014-09-25 113 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