У меня есть следующая функция, которая работает, как и ожидалось, в облачном коде Parse Server, но она очень медленная.
Вложенные циклы for
, которые являются внутренне вызывающими запросами и сохраняют функции, несомненно, являются основной причиной.
Как я могу реорганизовать этот код так, чтобы была некоторая асинхронная обработка или, что еще лучше, какие есть методы для удаления / редактирования отношений на объекте, документация вокруг этого очень плохая.
ClientLabels.applyClientLabels = async (req, res) => {
const { clients, labels } = req.params;
const user = req.user;
const objectIds = clients.map((client) => client.objectId);
const clientSaveList = [];
const clientClass = Parse.Object.extend('Clients');
const query = new Parse.Query(clientClass);
query.containedIn("objectId", objectIds);
const queryResult = await query.find({ sessionToken: user.getSessionToken() })
try {
for (const client of queryResult) {
const labelRelation = client.relation('labels');
const relatedLabels = await labelRelation.query().find({ sessionToken: user.getSessionToken() });
labelRelation.remove(relatedLabels);
for (const label of labels) {
label.className = "ClientLabels";
const labelRelationObj = Parse.Object.fromJSON(label)
labelRelation.add(labelRelationObj);
};
clientSaveList.push(client);
};
const saved = await Parse.Object.saveAll(clientSaveList, { sessionToken: user.getSessionToken() })
res.success(saved);
} catch (e) {
res.error(e);
};
}
Объяснение некоторой странности: мне нужно вызвать Parse.Object.fromJSON
, чтобы сделать объект метки на стороне клиента ParseObjectSubClass
и разрешить операции над ним, такие как добавление отношений.
Вы не можете использовать include в запросе отношений, как если бы вы указывали с помощью Pointer, поэтому должен быть запрос для отношений самостоятельно.Массив указателей был исключен, так как будет применено неизвестное количество меток.