Используйте функцию. Спросите себя, какие части одинаковы с разными, а затем возьмите разные части и задайте их параметры.
В вашем случае вот что отличается:
- Аргументы функция
- Генерация URL
- Данные, которые вы извлекаете из ответа
Итак, вот как вы можете создать функцию для инкапсуляции этих различий:
const baseUrl = 'https://api.banghasan.com/quran/format/json';
const returnAllData = data => data;
function createFetchMethod(urlBuilder, dataExtractor = returnAllData) {
return async (...params) => {
const url = urlBuilder(...params);
const response = await fetch(`${baseUrl}${url}`);
if (!response.ok) {
throw new Error("Something's wrong");
}
const json = await response.json();
if (json.status !== 'ok') {
throw new Error("Something's wrong");
}
return dataExtractor(json);
}
}
Способ, которым вы использовали бы это, состоит в том, чтобы создавать ваши методы следующим образом:
const getData = createFetchMethod(
keyword => `/cari/${keyword}/bahasa/id/mulai/0/limit/100`
);
const getAyat = createFetchMethod(
(surat, ayat) => `/surat/${surat}/ayat/${ayat}`,
json => json.ayat.data
);
const getNote = createFetchMethod(
num => `/catatan/${num}`,
json => json.catatan.teks
);
Теперь их можно вызывать, как и раньше, инкапсулируется только вся обработка ошибок. Вы можете дополнительно настроить, добавив больше параметров.
Обратите внимание, что одна потенциальная проблема с вашим строительным кодом URL заключается в том, что если вводимые параметры не являются URL-безопасными, вам нужно вызвать encodeURIComponent
, чтобы они экранировали специальные символы.