Проверка, равен ли объект JSON из promise нулю

#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));
    }
  });