Fetch возвращает [object Promise] вместо данных с response.text() и response.json()
Написал данный код:
const fetch_url = ({URL, BODY, CONTENT_TYPE, RESPONSE_TYPE}, METHOD) => {
CONTENT_TYPE = Number(CONTENT_TYPE);
RESPONSE_TYPE = Number(RESPONSE_TYPE);
let single = METHOD === 'GET' || METHOD === 'DELETE';
return fetch(URL, {
method: METHOD,
headers: single ? {} : {'Content-Type': CONTENT_TYPE === 1 ? 'text/plain' : 'application/json'},
redirect: single ? 'follow' : 'follow',
body: CONTENT_TYPE === 1 ? String(BODY) : JSON.stringify(BODY)})
.then(res => {
switch (RESPONSE_TYPE) {
case 1:
return res.text();
case 2:
return res.json();
case 3:
return String(res.ok);
case 4:
return res.status;
case 5:
return res.statusText;
case 6:
return res.type;
case 7:
return String(res.redirected);
case 8:
return res.url;
case 9: default:
return single ? res.url : String(res.bodyUsed);
}
})
.catch(err => '');
};
Он должен служить оболочкой для использования Fetch пользователями. Сам код работал, но функционала не хватало. И я решил добавить возможность возвращать сразу несколько res
Получилось это:
const fetch_url = ({URL, BODY, CONTENT_TYPE, RESPONSES_TYPES, SPLIT}, METHOD) => {
SPLIT = String(SPLIT);
CONTENT_TYPE = Number(CONTENT_TYPE);
RESPONSES_TYPES = RESPONSES_TYPES.split(' ').filter(word => word !== '');
let single = METHOD === 'GET' || METHOD === 'DELETE';
return fetch(URL, {
method: METHOD,
headers: single ? {} : {'Content-Type': CONTENT_TYPE === 1 ? 'text/plain' : 'application/json'},
redirect: single ? 'follow' : 'follow',
body: CONTENT_TYPE === 1 ? String(BODY) : JSON.stringify(BODY)})
.then(res => {
let responses = '';
for (let i = 0; i <= RESPONSES_TYPES.length - 1; i++) {
switch (Number(RESPONSES_TYPES[i])) {
case 1:
responses += SPLIT + res.text(); break;
case 2:
responses += SPLIT + res.json(); break;
case 3:
responses += SPLIT + String(res.ok); break;
case 4:
responses += SPLIT + res.status; break;
case 5:
responses += SPLIT + res.statusText; break;
case 6:
responses += SPLIT + res.type; break;
case 7:
responses += SPLIT + String(res.redirected); break;
case 8:
responses += SPLIT + res.url; break;
case 9: default:
responses += SPLIT + single ? res.url : String(res.bodyUsed); break;
}
}
return SPLIT === '' ? responses : responses.slice(1);
})
.catch(err => '');
};
Ну и как обычно происходит в таких ситуациях код перестал нормально работать. Вместо информации с res.text() и res.json() возвращается [object Promise]
(res.status, res.type и тд. при этом работают)
Может кто-нибудь сказать как это исправить?
Ответы (1 шт):
Автор решения: ksa
→ Ссылка
В нашей с ТСом переписке я ему предложил вот такую модель обработки его данных. Вот только на работоспособность мне проверить это не на чем.
const fetch_url = ({
URL,
BODY,
CONTENT_TYPE,
RESPONSES_TYPES,
SPLIT
}, METHOD) => {
SPLIT = String(SPLIT);
CONTENT_TYPE = Number(CONTENT_TYPE);
RESPONSES_TYPES = RESPONSES_TYPES.split(' ').filter(word => word !== '');
let single = METHOD === 'GET' || METHOD === 'DELETE';
return fetch(URL, {
method: METHOD,
headers: single ? {} : {
'Content-Type': CONTENT_TYPE === 1 ? 'text/plain' : 'application/json'
},
redirect: single ? 'follow' : 'follow',
body: CONTENT_TYPE === 1 ? String(BODY) : JSON.stringify(BODY)
})
.then(res => {
const responses = [];
for (let i = 0; i <= RESPONSES_TYPES.length - 1; i++) {
switch (Number(RESPONSES_TYPES[i])) {
case 1:
responses.push(res.text());
break;
case 2:
responses.push(res.json());
break;
case 3:
responses.push(String(res.ok));
break;
case 4:
responses.push(res.status);
break;
case 5:
responses.push(res.statusText);
break;
case 6:
responses.push(res.type);
break;
case 7:
responses.push(String(res.redirected));
break;
case 8:
responses.push(res.url);
break;
case 9:
default:
responses.push(single ? res.url : String(res.bodyUsed));
break;
}
}
return Promise.all(responses);
})
.then(arr => {
let responses = '';
for (let i = 0; i <= RESPONSES_TYPES.length - 1; i++) {
responses += SPLIT + arr[i];
}
return SPLIT === '' ? responses : responses.slice(1);
})
.catch(err => '');
};
Вот такой еще вариант можно сделать
const fetch_url = async({
URL,
BODY,
CONTENT_TYPE,
RESPONSES_TYPES,
SPLIT
}, METHOD) => {
SPLIT = String(SPLIT);
CONTENT_TYPE = Number(CONTENT_TYPE);
RESPONSES_TYPES = RESPONSES_TYPES.split(' ').filter(word => word !== '');
let single = METHOD === 'GET' || METHOD === 'DELETE';
try {
let res = await fetch(URL, {
method: METHOD,
headers: single ? {} : {
'Content-Type': CONTENT_TYPE === 1 ? 'text/plain' : 'application/json'
},
redirect: single ? 'follow' : 'follow',
body: CONTENT_TYPE === 1 ? String(BODY) : JSON.stringify(BODY)
})
let responses = '';
for (let i = 0; i <= RESPONSES_TYPES.length - 1; i++) {
switch (Number(RESPONSES_TYPES[i])) {
case 1:
responses += SPLIT + await res.text();
break;
case 2:
responses += SPLIT + await res.json();
break;
case 3:
responses += SPLIT + String(res.ok);
break;
case 4:
responses += SPLIT + res.status;
break;
case 5:
responses += SPLIT + res.statusText;
break;
case 6:
responses += SPLIT + res.type;
break;
case 7:
responses += SPLIT + String(res.redirected);
break;
case 8:
responses += SPLIT + res.url;
break;
case 9:
default:
responses += SPLIT + single ? res.url : String(res.bodyUsed);
break;
}
}
return SPLIT === '' ? responses : responses.slice(1);
} catch (err) {
return ''
}
};