Разбор облачного кода, доступ к отношениям объектов

Я пытаюсь создать функцию облачного кода 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"
    }
}
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
0
0
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

response.success(ret); будет работать до того, как relQuery.find закончит цикл for.

Используйте Обещание.все()

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

Итак, я могу использовать Promise.all() непосредственно перед response.success(ret), чтобы дождаться завершения двух query.find()? Как я могу ссылаться на них в аргументах Promise.all()?

Arthur 22.05.2019 14:59

Вроде работает, но теперь проблема с доступом results[i] в r["tag"] = results[i].get("tag");. Можно ли передать его как параметр?

Arthur 22.05.2019 15:54

Решил это, используя некоторые .then() и forEach() вместо for, спасибо за помощь.

Arthur 22.05.2019 17:10

@LordArt Рад быть полезным :)

Jeff Gu Kang 23.05.2019 05:39

Другие вопросы по теме