передача аргумента в функцию обратного вызова, прослушивающую аргументы - PullRequest
1 голос
/ 12 февраля 2020
function setmclisten(message, sender, sendResponse) {
  console.log(data);
  if(message['type'] === 'startUp')
  {
    console.log(data);
    sendResponse(data)
  }
}
function QuarryToServer(){
  chrome.runtime.onMessage.removeListener(setmclisten);
  $.ajax({
    type: "GET",
    async: true,
    form: 'formatted',
    url: SERVERURL,
    success: function (data) {
      //sends a get 
      console.log("set startup listener");
      debugger;
      chrome.runtime.onMessage.addListener(setmclisten);
    },
    fail: function () { console.error("error quarrying server"); }
  });
}

проблема im encountring, мне нужно, чтобы имя функции было названо, чтобы я мог позже удалить слушателя, но когда я делаю ее именованной функцией, я не могу получить доступ к переменной данных, и если я пытаюсь передать ее как addListen (весело c (args)) он будет просто вызывать функцию, а не передавать ее как переменную, если есть способ передать переменную, и в то же время все еще есть функция, определенная в глобальной области видимости, чтобы уточнить: так есть setmclisten и мне нужно, чтобы она была именованной функцией, и в то же время передавала аргумент данных и получала сообщения слушателя onmessge, такие как messge it self

1 Ответ

2 голосов
/ 12 февраля 2020

Мне кажется, я вижу проблему. Если у вас будет больше контекста, мы сможем помочь вам решить его лучше, но подход с минимальными изменениями заключается в запоминании последнего слушателя, например так (см. *** комментарии):

function setmclisten(message, sender, sendResponse, data) { // *** Note `data` param
                                                            // at end
  console.log(data);
  if(message['type'] === 'startUp')
  {
    console.log(data);
    sendResponse(data)
  }
}
let lastListener = null; // *** Remember the last listener
function QuarryToServer(){
  // *** Remove the last listener if any
  if (lastListener) {
      chrome.runtime.onMessage.removeListener(lastListener);
      lastListener = null;
  }
  $.ajax({
    type: "GET",
    async: true,
    form: 'formatted',
    url: SERVERURL,
    success: function (data) {
      //sends a get 
      console.log("set startup listener");
      // *** Create a new listener and attach it
      lastListener = function(message, sender, sendResponse) {
          return setmclisten(message, sender, sendResponse, data);
          // *** Or if `this` is important in the call:
          // return setmclisten.call(this, message, sender, sendResponse, data);
      };
      chrome.runtime.onMessage.addListener(lastListener);
    },
    fail: function () { console.error("error quarrying server"); }
  });
}

В качестве альтернативы всегда подключайте прослушиватель, а не добавляйте и удаляйте его, и используйте последние данные:

let lastData = null; // ***
function setmclisten(message, sender, sendResponse) {
  if (!lastData) {
    return;
  }
  console.log(lastData);
  if(message['type'] === 'startUp')
  {
    console.log(lastData);
    sendResponse(lastData)
  }
}
function QuarryToServer(){
  $.ajax({
    type: "GET",
    async: true,
    form: 'formatted',
    url: SERVERURL,
    success: function (data) {
      lastData = data; // ***
    },
    fail: function () { console.error("error quarrying server"); }
  });
}

В приведенном выше примере я предполагаю, что вы

chrome.runtime.onMessage.addListener(setmclisten);

один раз .

...