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

时间:2019-05-22 10:03:55

标签: javascript json parse-platform cloud-code

我正在尝试创建一个解析云代码函数,该函数返回与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"
    }
}

1 个答案:

答案 0 :(得分:0)

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

使用Promise.all()

或Async等待并重构您的逻辑。

我对您关于丢失的代码进行评论。

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
  });
});