2013-07-10 3 views
1

Я чувствую себя глупо, потому что некоторое время пытался получить доступ к этой переменной ответа, и я думаю, что я недостаточно понимаю закрытие или область видимости, поэтому, пожалуйста, помогите.Невозможно получить доступ к переменной ответа от chrome.runtime.sendMessage. (Закрытие?)

Я работаю над расширением chrome, и я отправляю сообщение from contentscript.js на background.js и получаю ответ. Теперь я хочу вернуть ответ и использовать его в contentcript.js. Похоже, то, что вы должны быть в состоянии сделать ...

function getWords(){ 

    var words = []; 

    chrome.runtime.sendMessage({detail: "words"}, function(response) { 
     console.log(response) // prints ["word1, "word2" ..] 
     words = response; 
    }); 

return words; // = [] 
} 

UPDATE: Спасибо, я понимаю, что мой вопрос сейчас, но все же хотел бы несколько советов, чтобы решить эту проблему. Мой вопрос - это лучший способ «спросить» справочную страницу для списка слов, если мне это нужно как параметр в другой функции. Могу ли я ждать возвращения информации? Должен ли я просто вызвать эту функцию из обратного вызова? или есть какой-то другой метод? В идеале я хотел бы фактически реализовать getWords(), который не возвращается, пока список не вернется ... Невозможно? Я открыт для библиотек с открытым исходным кодом.

+1

См [Асинхронный против синхронных метод] (https://developer.chrome.com/extensions/overview.html#sync) в документации расширения Chrome. Скажите мне, когда вы все еще не понимаете концепцию после прочтения этого, я укажу вам на другой пример. –

ответ

5

Потому что sendMessage является асинхронным вызовом, и вы рассматриваете его как синхронный. Вы пытаетесь прочитать слова до того, как вызов действительно будет выполнен. Невозможно дождаться этого. Вам нужно использовать обратные вызовы.

function getWords(callback){ 

    var words = []; 

    chrome.runtime.sendMessage({detail: "words"}, function(response) { 
     console.log(response) // prints ["word1, "word2" ..] 
     callback(response); 
    }); 

} 



function processWords(words){ 
    //do your logic in here 
    console.log(words); 
} 
getWords(processWords); 
+0

Спасибо за ответ. Это заставило меня понять, что было не так, но на самом деле не помогло мне найти решение, которое я ищу. Я думаю, мой вопрос - это лучший способ «спросить» справочную страницу для списка слов, если мне это нужно как параметр в другой функции. Могу ли я ждать возвращения информации, следует ли просто вызвать эту функцию из обратного вызова или есть какой-то другой метод? – FrancescoA

+0

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

+0

Я, вероятно, часто получаю этот список. Лучше использовать chrome.storage или использовать какой-либо другой способ общения? – FrancescoA

Смежные вопросы