在Parse Framework Cloud Code中运行同步查询

Mik*_*e V 6 javascript parse-platform

我为Parse Framework编写了一个异步云后台作业,根据"@"符号之前的电子邮件为每个用户生成一个显示用户名.不幸的是,当我运行这份工作时,我收到的错误是"计算操作太多".有没有办法让查询和保存串联运行而不是并行运行?我在文档中看到了promises的可能性,但我对如何使它与嵌套查询一起工作感到困惑.

Parse.Cloud.job("generateUsernameForEveryUser", function(request, status) {

  // Set up to modify user data
  Parse.Cloud.useMasterKey();
  var counter = 0;
  // Query for all users
  var query = new Parse.Query(Parse.User);
  query.each(function(user) {

    createUsernameForUser(user, 0, {
      success: function(username) {
        if(username == null) {
          status.error();
        } else {
          user.set("displayUsername", username);
          user.set("displayUsernameUppercase", username.toUpperCase());
          user.save();
        }
      },
      error: function(error) {
        status.error("Error: " + error.message);
      }         

    });

  }).then(function() {
    // Set the job's success status
    status.success("Username generation completed successfully.");
  }, function(error) {
    // Set the job's error status
    status.error("Uh oh, something went wrong.");
  });

});

function createUsernameForUser(user, count, callback) {  

  var generatedUsername = user.getEmail().substring(0, user.getEmail().indexOf("@"));

  if(count > 0) {
    //Quotes added to ensure no math is done between generatedUsername and count
    generatedUsername = "" +  generatedUsername + "" + count;
  }

  var userQuery = new Parse.Query(Parse.User);
  userQuery.equalTo("displayUsernameUppercase", generatedUsername.toUpperCase());
  userQuery.count({

    success: function(userCount) {

      if(userCount > 0) {
        createUsernameForUser(user, count + 1, {
          success : function(responseUsername) {
            callback.success(responseUsername);
          }, 
          error: function(error) {
            callback.error(error.message);
          }
        });
      }

      else {
        callback.success(generatedUsername);
      }

    },
    error: function(error) {
      console.log("Error trying to count users: " + error.message);
      callback.error("Error trying to count users: " + error.message);
    }

   });//End of userQuery call

}
Run Code Online (Sandbox Code Playgroud)

小智 0

这是一个很晚的答案,但对经历这个问题的人会有帮助。

too many count operations返回错误,因为仅当该类的数据为 100 行或更少时,query.each 才会起作用。

我们可以通过如下方式实现相同的要求:

  1. 获取所有用户。
  2. 创建用户名并将其存储到数组中。有关更多信息,请参阅 parse.com 批处理操作。 var users = new Array(); .... push all the created user objects to users .... Parse.Object.saveAll(users); //save the list -

希望这能解决。