Пытаясь реализовать функциональность, позволяющую пользователям выполнять частичное обновление некоторых данных, я предложил следующие логические операции:
- Извлечение и загрузка полей данных в форме.
- Пользователь вносит изменения в некоторые редактируемые поля и нажимает кнопку save.
- Проверьте, действительно ли поля изменились, затем отобразите поля для обновления
- Создайте массив обещаний выборки (по одному для каждогоредактируемое поле: конечная точка API для
PATCH
отличается от каждого редактируемого поля) - Используя
Promise.all
, получить массив ответов (обещаний) - Анализировать массив ответов для получения данныхМеня интересует.
Вот как я на самом деле реализовал вышеупомянутое:
/* EDIT RECORD
* @param path: path to the record (ex: '/record/2')
* @param fields: object containing fields to update (ex: { comment: "new comment here" })
*/
async editRecord(path, fields) {
const responsePromises = await Promise.all(
Object.keys(fields).map(field => // create an array of a number of fetch requests detemined by number of fields
this.patchRecord(path, field, fields[field]) // returns a fetch request
)
).then(res => res.map(each => each.json())); // return an array of "json decoded"?? response promises
/*
* For each response promise:
* 1. Grab a message or an errorlist
* 2. Append the message, or list of errors to an object holding the errors/messages of already parsed responses
*/
const { errors, messages } = await responsePromises.reduce(
async (parsedObjectPromise, response) => {
const parsedObject = await parsedObjectPromise;
const { data, errors: responseErrors } = await response;
let message;
if (data) [message] = data;
if (responseErrors) parsedObject.errors.push(...responseErrors);
if (message) parsedObject.messages.push(message);
return parsedObject;
},
{ errors: [], messages: [] }
);
console.log(errors, messages);
},
/*
* Returns a fetch request for one datafield update
* @param path: path to the record (ex: '/record/2')
* @param field: field to update (ex: 'comment')
* @param value: value to update field with (ex: 'new comment')
*/
patchRecord(path, field, value) {
let requestUrl = IR_HELPERS.buildFetchPath({ singleRecordPath: path });
requestUrl += `/${field}`; // ex: 127.0.0.1:2343/record/2/comment
return fetch(requestUrl, {
method: 'PATCH',
headers: {
Accept: 'application/json',
Authorization: `Bearer ${IR_HELPERS.token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ [field]: value }),
});
},
Это прекрасно работает, но для ясности:
- Оправдан ли этот подход или есть лучший способ реализовать вышеизложенное?
- Как я могу объединить два разных шага в функции
editRecord
?