#javascript #fetch-api
#javascript #выборка-api
Вопрос:
У меня была открыта другая похожая тема, и она получила отрицательный ответ. Я сталкиваюсь с законной проблемой здесь и уверяю вас, что я тщательно исследовал это. Я полагаю, что моя настоящая проблема, вероятно, заключается в синтаксисе, поскольку я не являюсь опытным программистом JS. Это была постоянная борьба в течение смущающих 2 недель. У меня есть следующее:
fetch('https://example.com/api/submission?data.dateOfService=' data.dateChanger 'amp;select=data.endingPettyTotal')
.then(response => response.json())
.then(data => instance.setValue(data[0].data.endingPettyTotal));
Я пытаюсь посмотреть на объект JSON, и если его длина равна нулю, установите для моего data.engingPettyTotal значение ‘0’. Если не равен нулю, то установите его равным значению объекта JSON, как у меня выше.
Кажется, я должен быть в состоянии выполнить это, проверив response.json().length, что-то похожее на это
fetch('https://example.com/api/submission?data.dateOfService=' data.dateChanger 'amp;select=data.endingPettyTotal')
.then(response => {
if(response.json().length === 0) {
console.log("empty")
return 0;
}
else {
console.log("not empty")
return
})
.then(data => instance.setValue(data[0].Balance));
}
К сожалению, это, похоже, тоже не работает. Опять же, предполагая, что я просто перепутал синтаксис или что-то в этом роде, но опять же, этот асинхронный материал сбивает с толку. Также предположим, что это можно было бы сделать с помощью Lodash (isEmpty или isNull).
Ответ №1:
response.json()
возвращает обещание, которое разрешается с помощью отправленных сервером данных
Выполните проверку во втором then()
fetch('https://example.com/api/submission?data.dateOfService=' data.dateChanger 'amp;select=data.endingPettyTotal')
.then(response => {
if(!response.ok){
return Promise.resolve(0)// or just throw error
}
return response.json())
}).then(data =>
// if not array or empty array set as zero
const val = (Array.isArray(data) amp;amp; data.length) ? data[0].Balance : 0;
instance.setValue(val);
})
Ответ №2:
response.json()
возвращает Promise
объект, попробуйте:
fetch('http://your.url')
.then(response => response.json())
.then(data => instance.setValue(data.length amp;amp; data[0].Balance));
или если вы не хотите устанавливать значение, если data.length равно 0:
fetch('http://your.url')
.then(response => response.json())
.then(data => data.length amp;amp; instance.setValue(data[0].Balance));
Ответ №3:
трудно точно сказать, каковы имена ваших параметров … являются ли они «data.DateOfService» на стороне сервера? (предполагая ниже, что это просто ‘DateOfService’)
отправка данных через json / FormData имеет различную обработку на стороне PHP. альтернатива отправке json — это new FormData() … и append(‘ключ’, «значение»); и вместо jsonData прикрепите FormData к атрибуту body.
const sendData = {
dateOfService: data.dateChanger,
select:data.endingPettyTotal
}
const jsonData = JSON.stringify(sendData);
const options = {
method:"POST",
body: jsonData
}
fetch('https://example.com/api/submission',options)
.then(response => response.json())
.then(data=>
{
if(data.length == 0) {
console.error("no data")
}
else {
console.log("not empty")
instance.setValue(data[0].Balance);
}
});
Комментарии:
1. DateOfService на самом деле является значением, которое я беру из формы. Я использую это в инструкции select на стороне сервера (PHP) для запроса MySQL, а затем отправляю обратно «Баланс», связанный с этой датой. Во всяком случае, я попробовал ваше выше, и оно отлично работает. Я только что добавил: instance.setValue(‘0’); для оператора if «нет данных». Огромное спасибо!
Ответ №4:
Вы не возвращаете обещание, которое возвращает JSON из вашей первой функции обратного вызова.
Поместите проверку во вторую .then()
.
fetch('https://example.com/api/submission?data.dateOfService=' data.dateChanger 'amp;select=data.endingPettyTotal')
.then(response => response.json())
.then(data => {
if (data.length == 0) {
console.log("empty");
} else {
console.log("not empty");
instance.setValue(data[0].data.endingPettyTotal));
}
});