Как отправить переменную с помощью addListener? - PullRequest
1 голос
/ 08 июня 2019

Мой всплывающий скрипт пытается получить переменную из скрипта содержимого:

browser.tabs.query({ active: true, currentWindow: true }, function (tabs) {
        //console.log("TryToCall");
        searchTerm = browser.tabs.sendMessage(tabs[0].id, { type: "getDoi" });
        console.log("received message: " + searchTerm);
        setButtons(searchTerm);
    });

Сценарий содержимого прослушивает с:

function listener(message, sender, response) {
    //console.log("called");
    switch (message.type) {
        case "getDoi":
            console.log("I heard you. I send " + searchTerm)
            return searchTerm ;
        default:
            //console.error("Unrecognised message: " + message);
            return "X";
    }
}

Проблема в следующем: вместо строки searchTerm (она определена в другом месте и правильно установлена ​​в слушателе, когда консоль выводит ее правильно), мое всплывающее окно получает [object Promise].

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

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Мне удалось временно решить проблему:

Я заменил обещание на sendResponse. Все, что отправлено с помощью sendResponse, затем читается через sendResponse.value:

function listener(message, sender, sendResponse) {
        switch (message.type) {
            case "getDoi":
                sendResponse ({ value: searchTerm });
            default:
                //console.error("Unrecognised message: " + message);
                sendResponse({value: "Error"});
        }    
}

Который подобран:

function handleResponse(message) {
    console.log("Message: " + message.value);
    setButtons(message.value);
}
function handleError(error) {
    console.log("Error: " + error.value);
}

    browser.tabs.query({ active: true, currentWindow: true }, function (tabs) {
        browser.tabs.sendMessage(tabs[0].id, { type: "getDoi" }).then(handleResponse,handleError);
    })

Так что, очевидно, sendResponse будет прекращено (? https://github.com/mozilla/webextension-polyfill/issues/16#issuecomment-296693219), и мне придется исправить это в какой-то момент, но пока это работает.

0 голосов
/ 08 июня 2019

Вы можете сделать это, когда получите значение обещания.

then - это объект, который запускается после того, как обещание было выполнено.Таким же образом, если обещание было отклонено, вы можете использовать .catch(res=>{}), чтобы получить какое-то исключение.

В этом случае это будет

 searchTerm.then((res)=>{
      return res;
 })
.then((res) => {
      console.log(res); //here is not a promise anymore, It will probably be an object that you can access
})

, и тогда у вас будетваша переменная в следующем тогда.Кроме того, это, вероятно, вернет вам объект json, но если вы хотите, чтобы он был в виде текста, вы можете сделать

searchTerm.then((res)=>{
      return res.path_to_string.text(); //Access the path of the res that contains the string you need and then convert it 
 })
.then((res) => {
      console.log(res); //You will have a string containing the whole object.
})

. Я предлагаю вам подробнее рассказать о Обещание Javascript

...