Объединение двух вызовов XHR с использованием chrome.runtime.SendMessage

#javascript #reactjs #google-chrome-extension

#javascript #reactjs #google-chrome-расширение

Вопрос:

У меня есть расширение Chrome, и я рефакторингую свои вызовы XHR в фоновый скрипт для доступа через обмен сообщениями в соответствии с новыми требованиями Chrome 73 и выше для предоставления данных XHR для сценариев содержимого. У меня есть два вызова XHR — первый захватывает данные, а второй вызов XHR использует значение, возвращенное из первого, как часть его запроса.

 // background.js
// First Call
chrome.runtime.onMessage.addListener(
  (request, sender, sendResponse) => {
    if (request.contentScriptQuery === 'getProductData') {
      let dataUrl = C.API(request.term);
      $.ajax({
        url: dataUrl,
        type: 'get',
        mode: 'no-cors',
        dataType: 'json',
      }).then(response => response)
        .then(text => sendResponse(text))
        .catch(err => console.log(err));
      return true;
    }
  });

// Second Call
chrome.runtime.onMessage.addListener(
  (request, sender, sendResponse) => {
    if (request.contentScriptQuery === 'getProductGroupData') {
      const dataUrl = C.PRODUCT_GROUPS_API(request.term);
      $.ajax({
        url: dataUrl,
        type: 'get',
        mode: 'no-cors',
        dataType: 'json',
      })
        .then(response => response)
        .then(text => sendResponse(text))
        .catch((err) => {
          console.log(err);
        });
      return true;
    }
  });  

В моем компоненте React у меня есть метод, который вызывает эти методы. В первом сообщении сообщения я присваиваю возвращенным данным значения состояния. Это работает так, как ожидалось. Однако второе сообщение не отправляется, и даже просто поменяв местами инструкцию журнала, я, похоже, не могу заставить его сработать.

 // Content Script
// React component. fetchData() called from inside componentDidMount()
fetchData() {
    chrome.runtime.sendMessage(
      { contentScriptQuery: 'getProductData', type, term: searchTerm },
      text =>
        this.setState({
          // assign values from returned data
          superCategoryId: text.content[0].productGroupHierarchy.superCategoryId,          
        }),
    );
  
    chrome.runtime.sendMessage(
      { contentScriptQuery: 'getProductGroupData', term: this.state.superCategoryId },
      text =>
        this.setState({
            // assign values from returned data
        }),
    );
}  

Существует ли какое-либо ограничение на отправку нескольких сообщений сообщения слушателю в фоновом скрипте? Первый вызов XHR и сообщение возвращает данные, второй, похоже, вообще не выполняется (я заменил сообщение return сообщением console, и оно тоже не возвращается.

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

1. Нет такого ограничения AFAIK. Это то, что нужно отлаживать в devtools. Установите точку останова в скрипте содержимого и в фоновом прослушивателе скриптов, запустите код, выполните его построчно и проверьте переменные, посмотрите, что происходит на обоих концах.

2. С другой стороны, я никогда не видел, чтобы для onMessage использовалось несколько прослушивателей, поэтому может быть ограничение — в конце концов, это упрощенный одноразовый обмен сообщениями — или даже ошибка.