解析云代码,访问对象关系

Parse cloud code, access object relations

我正在尝试创建一个 Parse 云代码函数,它 returns 与 parse/classes/MyClass 上的 GET 的结果相同,但具有关系的 ID。

我已经为一个对象完成了,但我无法让它循环工作以获取所有对象。

这就是我试图获取所有对象的方式。它在没有 for 循环和 r 作为响应的情况下工作。

Parse.Cloud.define('get_ClassName', function(request, response) {
  let query = new Parse.Query('ClassName');
  var ret = {};

  query.find({useMasterKey: true}).then(function(results) {
        for (var i = 0; i < results.length; i++) {
                ret[i] = {};
                const relQuery = results[i].get('status').query();
                relQuery.find({useMasterKey: true}).then(function(res) {
                        var ids = {};
                        for (var j  = 0; j < res.length; j++) {
                                ids[j] = res[j].id;
                        }
                        var status = {...status, id: ids};
                        status["className"] = "Status";
                        var r = {...r, status: status};
                        r["tag"] = results[i].get("tag");
                        ret[i] = r; //Can't access ret
                        //response.success(r); //Working
                })
        }
        response.success(ret);
  });
});

这是工作版本的实际结果:

{
    "result": {
        "status": {
            "id": {
                "0": "xxxxxx",
                "1": "xxxxxx"
            },
            "className": "Status"
        },
        "tag": "value"
    }
}

response.success(ret); 将在 relQuery.find 完成 for 循环之前 运行。

使用Promise.all()

或 Async await 并重构您的逻辑。

我评论你的代码关于你的失踪。

Parse.Cloud.define('get_ClassName', function(request, response) {
  let query = new Parse.Query('ClassName');
  var ret = {};

  query.find({useMasterKey: true}).then(function(results) { // Asyncronous
        for (var i = 0; i < results.length; i++) {
                ret[i] = {};
                const relQuery = results[i].get('status').query();
                relQuery.find({useMasterKey: true}).then(function(res) { // Asyncronous
                        var ids = {};
                        for (var j  = 0; j < res.length; j++) {
                                ids[j] = res[j].id;
                        }
                        var status = {...status, id: ids};
                        status["className"] = "Status";
                        var r = {...r, status: status};
                        r["tag"] = results[i].get("tag");
                        ret[i] = r; //Can't access ret
                        //response.success(r); //Working
                        console.log(`index {i}`, r);
                })
        }
        console.log(`response will be called`);
        response.success(ret); // Called before `relQuery.find` finish
  });
});