Ich weiß, dass das Warten auf eine asynchrone Methode dumm ist, one should use callbacks instead. Was aber, wenn eine Drittanbieter-API zwingt, synchron zu sein?Warten auf den Callback-Rückgabewert einer asynchronen Methode?
Ich entwickle eine Chrome-Erweiterung, die den Benutzer daran hindert, Websites zu besuchen, die bereits auf einer anderen Registerkarte geöffnet sind. Ich muss im Grunde Anfragen basierend auf den URLs in offenen Tabs abbrechen. Ich möchte chrome.webRequest.onBeforeRequest
wie folgt verwenden:
function onBeforeRequest(details) {
var websiteAlreadyOpenInOtherTab;
// Here i want to set `websiteAlreadyOpenInOtherTab` by using the `chrome.tabs`
// API. It's asynchronous though and that's my problem. I cant return a value
// from an asynchronous method call.
if (websiteAlreadyOpenInOtherTab) {
return { cancel: true };
}
}
chrome.webRequest.onBeforeRequest.addListener(
onBeforeRequest,
{ urls: ['<all_urls>'], types: ['main_frame'] },
['blocking']);
Hoffentlich Sie mein Dilemma in dem obigen Code zu sehen. Ich muss ein Objekt basierend auf dem Ergebnis asynchroner Methodenaufrufe zurückgeben. Ist es möglich, dies zu erreichen?
Nein, es ist nicht :-( – Bergi
Können Sie nicht alle 'chrome.tabs' Änderungen anhören und haben' websiteAlreadyOpenInOtherTab' bereits den richtigen Wert, wenn 'onBeforeRequest' aufgerufen wird? – Bergi
Ich denke, Sie sind approachi ng das Problem falsch. Erstens, wenn Dinge asynchron sein müssen, dann arbeiten Sie innerhalb des Modells und verwenden Sie einen asynchronen Callback, in dem, wenn Sie entscheiden, dass die Registerkarte nicht geöffnet sein sollte, Sie es schließen, anstatt eine synchrone Antwort zu erfordern. Es gibt eine separate API-Funktion, um Tabs zu schließen, Sie müssen nicht nur von der onbeforerequest false zurückgeben ... – davin