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