无法在我的云代码中执行 query.find()

can't execute query.find() in my cloud code

我有一个云代码,可以从 'Core' 和 HTTP API 获取数据并对其进行一些逻辑处理。现在我想根据结果发送推送通知,但代码甚至没有执行这里是一段代码

.then(function(result) {
  for (var i = 0; i < queryObjects.length; i++) {
    var object = queryObjects[i];

    console.log('This will loop for '+queryObjects.length+' times');

    var pushQuery = new Parse.Query(Parse.Installation);
    pushQuery.equalTo('installationID',object.get('installationID'));
    pushQuery.equalTo('deviceType','ios');
    Parse.Push.send({ 
      where: pushQuery,
      data: {
          alert: "When do we take to outer space",
          badge: "Increment"
        }
      }, {
        success: function() {
          console.log("Push was successful");
        },
        error: function(error) {
          console.error(error);
        }
    });
  }

即使我尝试执行 query.find() 也没有任何反应

.then(function(result) {
      for (var i = 0; i < queryObjects.length; i++) {
        var object = queryObjects[i];

        console.log('This will loop for '+queryObjects.length+' times');

        var pushQuery = new Parse.Query(Parse.Installation);
        pushQuery.equalTo('installationID',object.get('installationID'));
        pushQuery.equalTo('deviceType','ios');
        pushQuery.find({
          success:function(list) {
            console.log("Query Data: "+list);
          },
          error: function(error) {
            console.log("Error: " + error.code + " " + error.message);
          }
        });
      }

这是因为 Push.Send 函数的异步性质。您在一个循环中多次调用它,但是在从 .then 块 returning 之前,您不等待任何这些调用完成。要知道,当一个异步函数Pasrereturns时,并不一定就结束了。你需要等待它的 Promise 被履行以确保它已经完成。

您可以更改您的代码以确保只调用一次 Parse.Push 函数(在您的安装查询中,对您在循环中构建的 installationID 数组使用 containedIn 约束并调用Parse.Push 仅在循环后执行一次并确保 return 它的 Promise。

另一种解决方案是,每次在循环中调用 Parse.Push 函数时,都需要将它们推送到一个 promise 数组中,然后等待它们全部使用完 Parse.Promise.when(promises);.文档非常清楚地说明了如何并行等待 Promises。