2014-06-25 65 views
-7

我有一個onMessage.addListener功能是這樣的:每次使用onMessage.addListener responseCallback時,是否必須調用return true?

chrome.runtime.onMessage.addListener(function (r, s, sendResponse) { 
    if (r.action == "read") { 
     readManga(request, function() { 
      sendResponse({}); 
     }, true); 
    } 
    if (r.action == "write") { 
     readManga(request, function() { 
      sendResponse({}); 
     }, true); 
    } 
    if (request.action == "update") { 
     $.each(request.list, function (index, val) { 
      resetManga(val, function() {}, false); 
     }); 
     saveList(); 
     refreshUpdate(); 
     sendResponse({}); 
    } 
    if (request.action == "release") { 
     releaseImplentationFromId(request.id, function (mirrorName) { 
      updateMirrors(function() { 
       sendResponse({ 
        mirror : mirrorName 
       }); 
      }); 
      return true 
     }); 
    } 
} 

(這是摘錄,但it's working code並請忽略所有的,如果的,因爲很久以前我應該使用情況)

每次我使用回調函數sendResponse(同樣,我需要重命名它,但讓我們忽略它)如定義in the documentation從不使用,除非我的return true執行後。這真的很有必要,或者我剛剛發現一個骯髒的黑客,我做錯了什麼?

+0

[Chrome擴展消息傳遞:響應未發送]的可能重複(https://stackoverflow.com/questions/20077487/chrome-extension-message-passing-response-not-sent) – Makyen

回答

1

這是預期的行爲,並明確在documentation說:

這個函數[sendResponse]變爲無效時,事件偵聽器返回時,除非你從事件​​偵聽器返回true,表示要送異步響應(這將保持消息通道開放到另一端,直到調用sendResponse)。

您的函數updateMirrors顯然是異步的:回調函數不會立即執行,而是發送到隊列中。所以,你在執行後沒有返回true,你實際上在sendResponse之前碰到return true

因此,有必要告訴Chrome「稍後有望得到答案」。

+0

因此,對於每個回調函數(所有這些都是異步的,所以不用擔心)我需要添加'return true'。 – Braiam

+0

你可以在'onMessage'監聽器的末尾執行一次,'if's之後 – Xan

相關問題