So che aspettare un metodo asincrono è stupido, one should use callbacks instead. Ma cosa succede se un'API di terze parti ti obbliga ad essere sincrono?Come attendere il valore di ritorno della callback di un metodo asincrono?
Sto sviluppando un'estensione per Chrome che impedirà all'utente di visitare siti Web già aperti in un'altra scheda. Fondamentalmente ho bisogno di cancellare le richieste in base agli url nelle schede aperte. Voglio usare chrome.webRequest.onBeforeRequest
come questo:
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']);
Speriamo che si vede il mio dilemma nel codice sopra. Devo restituire un oggetto in base al risultato delle chiamate al metodo asincrono. È possibile raggiungere questo?
No, non è :-( – Bergi
Non puoi ascoltare tutte le modifiche di 'chrome.tabs' e avere' websiteAlreadyOpenInOtherTab' già contenente il giusto valore quando viene chiamato 'onBeforeRequest'? – Bergi
Penso che tu sia approachi ng il problema in modo errato. In primo luogo, se le cose devono essere asincrone, invece di richiedere una risposta sincrona, lavorare all'interno del modello e utilizzare una richiamata asincrona in cui se si decide che la scheda non deve essere aperta, la si chiude. C'è una funzione API separata per chiudere le schede, non è necessario restituire false solo da onbeforerequest ... – davin