2013-07-10 50 views
1

我覺得很蠢,因爲我一直試圖訪問這個響應變量一段時間,我想我不明白關閉或範圍足夠好,所以請幫助。無法從chrome.runtime.sendMessage訪問響應變量。 (關閉?)

我正在研究鉻擴展,我正在從contentcript.js發送一條消息到background.js並接收響應。現在我想返回響應並能夠在contentscript.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

請參閱Chrome擴展文檔中的[異步與同步方法](https://developer.chrome.com/extensions/overview.html#sync)。告訴我,當你在閱讀完這些概念之後仍然不理解這個概念時,那麼我會指出另一個例子。 –

回答

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

除非api有辦法強制同步調用,否則我懷疑你將無法做到你想要的。 – epascarello

+0

我可能會很頻繁地得到這個列表。使用chrome.storage還是使用其他一些通信方法更好? – FrancescoA