Проблема JavaScript с выборкой

#javascript

#javascript

Вопрос:

У меня возникли проблемы со следующей функцией:

 function archive_email() {
  let emailID = localStorage.emailID.toString();
  let emailid = '/emails/'   emailID;
  
  // Use Fetch to update database, archiving this email.
  fetch(emailid, {
    method: 'PUT',
    body: JSON.stringify({
      archived: true
    })
  })
  load_inbox();
}
  

Это для класса, где я создаю базовый почтовый клиент и сервер.

Приведенный выше код вызывается из нажимаемой кнопки, которая имеет свой собственный обработчик прослушивания. Как есть, это работает так, как ожидалось: при нажатии кнопки она устанавливает логическое значение в sqllite DB, а затем запускает функцию load_inbox() . Проблема в том, что load_inbox () запускается слишком рано, поскольку он не должен показывать какие-либо электронные письма с архивными тегами, но они отображаются при вызове load_inbox() . Если я обновлю страницу, они затем исчезнут, как и должны. Я попытался дождаться возврата обещания, например:

 function archive_email() {
  let emailID = localStorage.emailID.toString();
  let emailid = '/emails/'   emailID;
  
  // Use Fetch to update database, archiving this email.
  fetch(emailid, {
    method: 'PUT',
    body: JSON.stringify({
      archived: true
    })
  })
  .then(response => response.json())
  .then(result => {
    // Print result
    console.log(result);
});
  load_inbox();
}
  

Тем не менее, я получаю следующую ошибку с приведенным выше:

Неперехваченная (в обещании) ошибка синтаксиса: неожиданное завершение ввода JSON в inbox.js:327

Строка 327 — это .затем строка, которую я вставил выше:

 .then(response => response.json())
  

У кого-нибудь есть какие-либо предложения о том, как заставить это работать?
Спасибо за ваше время.

Комментарии:

1. fetch() Вызов запускает HTTP-запрос, но не ждет его завершения; он возвращается практически сразу.

2. Ошибка сообщает вам, что данные, возвращенные с сервера, являются недопустимым json

3. Если я понимаю вашу цель, вам нужно вставить load_inbox() свой .then блок

4. Если вы не используете результат, вам не нужна строка с ошибкой, и вы можете вызвать load_inbox() свой первый then()

Ответ №1:

используйте load_inbox() внутри then, чтобы он вызывался после разрешения обещания запроса. Ошибка, которую вы получаете, означает, что ответ, возвращенный с сервера, не является допустимым json.

Ответ №2:

Спасибо за помощь! Благодаря опубликованному совету у меня есть код, работающий с этим незначительным изменением:

 function archive_email() {
  let emailID = localStorage.emailID.toString();
  let emailid = '/emails/'   emailID;
  
  // Use Fetch to update database, archiving this email.
  fetch(emailid, {
    method: 'PUT',
    body: JSON.stringify({
      archived: true
    })
  })
  .then(response => {
    load_inbox();
  });