Почему JSON.stringify теряет часть объекта?

Добрый день! У меня есть JavaScript объект
let form = {
  img: "...", // тут закодированная base64 строка
  name: "smth",
  desc: "smth"
}

При попытке превратить объект в строку для передачи, возникает проблема: на выходе получается такая строка:
{"name":"smth","desc":"smth"}
То бишь, куда-то затерялось base64 изображение.

Можно ли это как-то поправить?
5e1da89c514b3389809105.png

Весь код

document.getElementById("back").addEventListener("click", function(e){
  move("search")
})

document.getElementById('ok').addEventListener('click', () => {
  let form = {};
  if(document.getElementById('load_img').files.length > 0) {
    var img = document.getElementById('load_img').files[0];
    var reader = new FileReader();
    reader.readAsDataURL(img);
    reader.onload = function() {
      form.img = encodeURIComponent((reader.result).split(',')[1]);
      // form.img = encodeURIComponent(btoa('hahahahahahh'));
    }
  } else {
    form.img = '';
  }

  form.name = encodeURIComponent(document.getElementById('name').value);
  form.desc = encodeURIComponent(document.getElementById('desc').value);

  console.log(form);

  var xhr = new XMLHttpRequest();
  xhr.open('GET', 'https://host/api/?product.create=' + JSON.stringify(form));
  // xhr.send();

  console.log('Form: ' + form);
  console.log(JSON.stringify(form));

  xhr.onreadystatechange = () => {
    if(xhr.readyState == 4 && xhr.status == 200) {
      console.log(xhr.responseText);
      var data = JSON.parse(xhr.responseText);

      if(data.code == 1) {
        alert('Товар успешно создан');
        move('search');
      } else {
        alert('Ошибка! ' + data.text);
        move('search');
      }
    }
  }
});

  • Вопрос задан
  • 440 просмотров
Решения вопроса 1
tdesu
@tdesu Автор вопроса
Решил проблему ;)
Проблема была в том, что ридер файла работает в асинхроне, как и сказал Алексей Тен .
Благодарю всех за помощь!
Корректный ответ
5e1daf62b288b013629026.png


Поместил XHR отправку в отдельную функцию и вызываю только когда сработает "onload" у ридера файлов.
Листинг

let form = {};
document.getElementById('ok').addEventListener('click', () => {
  if(document.getElementById('load_img').files.length > 0) {
    var img = document.getElementById('load_img').files[0];
    var reader = new FileReader();
    reader.readAsDataURL(img);
    reader.onload = function() {
      form.img = encodeURIComponent((reader.result).split(',')[1]);
      form.name = encodeURIComponent(document.getElementById('name').value);
      form.desc = encodeURIComponent(document.getElementById('desc').value);
      send();
    }
  } else {
    form.img = '';
    form.name = encodeURIComponent(document.getElementById('name').value);
    form.desc = encodeURIComponent(document.getElementById('desc').value);
    send();
  }

  console.log(form);
});

function send() {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', 'https://host/api/?product.create=' + JSON.stringify(form));
  // xhr.send();

  console.log('Form: ' + form);
  console.log(JSON.stringify(form));

  xhr.onreadystatechange = () => {
    if(xhr.readyState == 4 && xhr.status == 200) {
      console.log(xhr.responseText);
      var data = JSON.parse(xhr.responseText);

      if(data.code == 1) {
        alert('Товар успешно создан');
        move('search');
      } else {
        alert('Ошибка! ' + data.text);
        move('search');
      }
    }
  }
}

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@akhoronko
form.img заполняется асинхронно в reader.onload, поэтому в момент вызова JSON.stringify его может не быть
Ответ написан
Комментировать
Chefranov
@Chefranov
Новичок
При формировании base64 картинки у вас наверно есть перевод строк или типа того. По коду должно работать

Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы