简体   繁体   English

解析Cloud代码无法响应承诺的错误或成功

[英]Parse Cloud code not responding error or success with promises

My Parse cloud code is not responding with an error or success. 我的Parse云代码没有错误或成功响应。 It just times out, I don't know what I'm doing wrong. 只是超时,我不知道我在做什么错。 It should save multiple values in different tables, and finish with sending a push message to a user. 它应将多个值保存在不同的表中,并最后向用户发送推送消息。

The push message and user table are adjusted and send, but the street and the ledger objects are not being saved correctly. 调整了推送消息和用户表并发送,但是街道和分类帐对象未正确保存。 Also the response is not being called. 此外,没有调用响应。

I did work in the past (or I was just lucky). 我过去曾做过工作(或者我很幸运)。 Any thought on what I'm doing wrong? 对我在做什么错有任何想法吗?

  var buyerId = request.params.buyerid;
  var sellerName = request.params.sellername;
  var streetId = request.params.streetid;
  var amount = request.params.amount;
  var pushMessageTemplate = request.params.pushMessage;

  var log = request ? request.log : console;
  var Streets = Parse.Object.extend('SHStreets');
  var streetQuery = new Parse.Query(Streets);
  streetQuery.equalTo("objectId", streetId);
  streetQuery.first({
    useMasterKey: true,
    success: function (street) {
      var streetName = street.get("name");

      var query = new Parse.Query(Parse.User);
      query.equalTo("objectId", buyerId);
      query.first({
        useMasterKey: true,
        success: function (user) {
          var promises = [];
          var now = new Date();

          var buyerName = user.get("username");
          // Set and save the change
          user.set("balance", user.get("balance") - amount);
          user.set("streets", user.get("streets") + 1);

          street.set("current_owner", user);
          street.set("owned_since", now);
          street.set("for_sale", false);
          street.set("price_bought", amount);

          var acl = new Parse.ACL();
          acl.setPublicReadAccess(true);
          acl.setWriteAccess(user, true);
          street.setACL(acl);

          //update ledger
          var Ledger = Parse.Object.extend("Ledger");
          var ledger = new Ledger();

          ledger.set("type", "buy");
          ledger.set("amount", amount);
          ledger.set('ledger_time', now);
          ledger.set("user", user);
          ledger.set("description", "x");

          promises.push(Parse.Object.saveAll([street, user, ledger], { useMasterKey: true }));

          // Find users with a given email
          var userQuery = new Parse.Query(Parse.User);
          userQuery.equalTo("objectId", user.id);

          var pushQuery = new Parse.Query(Parse.Installation);
          pushQuery.exists("user"); // filter out installations without users
          pushQuery.include('user'); // expand the user pointer
          pushQuery.matchesQuery("user", userQuery);

          // Send push notification to query
          promises.push(Parse.Push.send({
            where: pushQuery, // Set our installation query
            data: {
              alert: _.template(pushMessageTemplate)({
                sellername: sellerName,
                streetname: streetName,
                amount: amount
              })
            }
          }, {
              useMasterKey: true,
          }));

          return Parse.Promise.when(promises).then(function () {
            response.success("success");
          });
        },
        error: function (error) {
          log.error('buy-street error', error.message);
          response.error("Uh oh, buy request success failed." + error.message);
        }
      });
    },
    error: function (error) {
      log.error('buy-street error', error.message);
      response.error("Uh oh, buy request success failed." + error.message);
    }
  });

It looks like your first query's success function doesn't return anything: 您的第一个查询的成功函数似乎未返回任何内容:

streetQuery.first({
useMasterKey: true,
success: function (street) { // this function doesn't return anything
  // ...
  query.first({  // You probably want to return this promise
    useMasterKey: true,
    success: function (user) { // this is the function that you're returning to
      // ...
      return Parse.Promise.when(promises).then(function () {
        response.success("success");
      });
    },
  });
}

}); });

Javascript will return undefined by default if you don't have a return statement. 如果没有return语句,则默认情况下Javascript将返回undefined

I was missing a function error for the return of the promises. 我丢失了返回诺言的函数错误。

 return Parse.Promise.when(promises).then(function () {
    // Set the job's sucess status
    response.success('success');
 },function(error) {
    response.error(error);
 });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM