Как я могу реализовать, чтобы мой обработчик событий возвращал истинный? (все перепробовал, но ошибка возвращается)
Я получаю следующую ошибку:
"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;
}
});
Спасибо, я проверяю весь остальной код. Думал, что проблема в том, что написано выше, и поэтому (логически) ничего не помогло.
См. support.google.com/chrome/thread/2047906?msgid=2556826, если эта ошибка возникает в Chrome 73.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Кажется, исправлено сейчас. Добавил 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;
});
Спасибо чувак. Была такая же проблема, не мог понять в чем дело. "вернуть истину"; починил это!
return true может решить вашу проблему только потому, что:
вам всегда нужно отправить ответ, вы можете отправить ответ на любое значение, но вы должны отправить ответ.
В вашем коде есть много ситуаций, чем нет ответа.
Эта функция sendresponse становится недействительной, когда прослушиватель событий возвращается, если вы не вернете true из прослушивателя событий, чтобы указать, что вы хотите отправить ответ асинхронно (это будет держать канал сообщений открытым для другого конца, пока не будет вызван sendResponse).
ссылка: https://developer.chrome.com/extensions/runtime#event-onMessage
Опубликованный код не вызывает асинхронные функции, поэтому здесь нет необходимости добавлять
return true. Проблема должна быть в чем-то другом, не в опубликованном коде, а скорее в коде, который отправляет сообщение. Также непонятно, почему вы связали проблему с полифиллом WebExtension, который вы здесь не используете.