Как реализовать «вернуть истину»? Ошибка: «Порт сообщений закрыт до получения ответа»

Как я могу реализовать, чтобы мой обработчик событий возвращал истинный? (все перепробовал, но ошибка возвращается)

Я получаю следующую ошибку:

"Unchecked runtime.lastError: The message port closed before a response was received."

Решение:

"Note: The sendResponse callback is only valid if used synchronously, or if the event handler returns true to indicate that it will respond asynchronously. The sendMessage function's callback will be invoked automatically if no handlers return true or if the sendResponse callback is garbage-collected."

https://developer.chrome.com/extensions/messaging#simple

редактировать: см. также (хром): https://github.com/mozilla/webextension-polyfill/issues/130

Вот мой код, буду очень признателен:

// receive message from pop-up or options
chrome.extension.onMessage.addListener(function (aRequest, aSender, 
aSendResponse) {
    if (!aSender) {
        return;
    }
    switch (aRequest.cmd) {
        // reload lists
    case 'reload':
        XX.blockedDomains = {};
        XX.load();
        break;
        // send list of recently blocked
    case 'blocked':
        aSendResponse(Object.keys(XX.blockedDomains));
        break;
        // deny domain
    case 'deny':
        XX.blocklist[aRequest.domain] = 1;
        delete XX.blockedDomains[aRequest.domain];
        XX.save();
        break;
    }
});

Опубликованный код не вызывает асинхронные функции, поэтому здесь нет необходимости добавлять return true. Проблема должна быть в чем-то другом, не в опубликованном коде, а скорее в коде, который отправляет сообщение. Также непонятно, почему вы связали проблему с полифиллом WebExtension, который вы здесь не используете.

wOxxOm 17.02.2019 20:34

Спасибо, я проверяю весь остальной код. Думал, что проблема в том, что написано выше, и поэтому (логически) ничего не помогло.

Aldunnord 17.02.2019 21:40

См. support.google.com/chrome/thread/2047906?msgid=2556826, если эта ошибка возникает в Chrome 73.

Jonathan Lin 17.03.2019 14:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
3
14 236
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Кажется, исправлено сейчас. Добавил return true;на предпоследней строке и теперь в логе больше нет записей об ошибках.

Это решение подходит? Буду рад отзывам, если что-то не так. В противном случае я отмечу эту тему через несколько дней как решенную.

// receive message from pop-up or options
chrome.extension.onMessage.addListener(function (aRequest, aSender, 
aSendResponse) {
    if (!aSender) {
        return;
    }
    switch (aRequest.cmd) {
        // reload lists
    case 'reload':
        XX.blockedDomains = {};
        XX.load();
        break;
        // send list of recently blocked
    case 'blocked':
        aSendResponse(Object.keys(XX.blockedDomains));
        break;
        // deny domain
    case 'deny':
        XX.blocklist[aRequest.domain] = 1;
        delete XX.blockedDomains[aRequest.domain];
        XX.save();
        break;
    }
    return true;
});

Спасибо чувак. Была такая же проблема, не мог понять в чем дело. "вернуть истину"; починил это!

010011100101 04.06.2021 19:16

return true может решить вашу проблему только потому, что:

вам всегда нужно отправить ответ, вы можете отправить ответ на любое значение, но вы должны отправить ответ.

В вашем коде есть много ситуаций, чем нет ответа.

Эта функция sendresponse становится недействительной, когда прослушиватель событий возвращается, если вы не вернете true из прослушивателя событий, чтобы указать, что вы хотите отправить ответ асинхронно (это будет держать канал сообщений открытым для другого конца, пока не будет вызван sendResponse).

ссылка: https://developer.chrome.com/extensions/runtime#event-onMessage

Другие вопросы по теме