Разобрать облачный код, получить доступ к объектным отношениям - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь создать функцию облачного кода Parse, которая возвращает тот же результат, что и GET для parse/classes/MyClass, но с идентификаторами отношений.

Я сделал это для одного объекта, но я не могу заставить его работать в цикле, чтобы получить все объекты.

Вот так я пытаюсь достать все предметы. Он работает без цикла 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 голосов
/ 22 мая 2019

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