0

とりわけ、次のコンテンツを含むタブがあります。

<meta http-equiv="refresh" content="0; URL='whatsoever'" />

この手法を使用してすべてのタブを登録するプラグインも実行しています。

chrome.tabs.onUpdated.addListener(doStuff);

doStuff 関数は、タブにメッセージを送信します。

function doStuff(tabId, changeInfo, tab){

    chrome.tabs.sendMessage(tabId, {'message': 'content'}, function(response){

        doOtherStuff(response);

    });

}

スクリプトを登録しました (ここには表示されません)。そのスクリプトでは、次のことが起こります。

function receiveMessage(request, sender, sendResponse){

    sendResponse({'content': 'responseData'});

}

chrome.extension.onMessage.addListener(receiveMessage);

私の問題は、瞬時の更新が原因で応答がタイムアウトし、コンソールに次のエラーが表示されることです。

応答を送信できませんでした: リスナーが戻った後に応答を送信する場合は、chrome.extension.onMessage リスナーが true を返す必要があります (メッセージは拡張機能 XYZ によって送信されました)。

それはなぜですか? また、この問題を回避するにはどうすればよいですか? 前もって感謝します。

4

1 に答える 1

1

関数 receiveMessage は return true; で終了する必要があります。そうして初めて、メッセージは送信され続けます。false の場合、関数が戻った瞬間に中止されます。したがって、return true を追加します

見る:

この関数は、イベント リスナーから返されたときに無効になります。ただし、イベント リスナーから true を返して、非同期で応答を送信することを示す場合を除きます (これにより、sendResponse が呼び出されるまでメッセージ チャネルが相手側に開かれたままになります)。

ドキュメントから: https://developer.chrome.com/extensions/runtime#event-onMessage

function receiveMessage(request, sender, sendResponse){

    sendResponse({'content': 'responseData'});
    return true;
}

chrome.extension.onMessage.addListener(receiveMessage);
于 2016-08-08T20:24:03.587 に答える