[Javascript] Scope delle Promise

ken_korn

Nuovo Utente
27 Apr 2017
14
2
3
Ho la seguente funzione con la quale, tramite le web APIs di Mozilla, dovrei ottenere la favicon del sito corrente.
La mia domanda, come suggerisce il titolo, è come esportare il valore nello scope della Promise al di fuori della stessa
JavaScript:
function getFavicon(){

        var faviconUrl;
      
        function onGot(tabInfo){
            faviconUrl = tabInfo[0].favIconUrl;
        };
      
        var currentTab = browser.tabs.query({active:true, currentWindow:true});
        var x = currentTab.then(onGot);
      
        return faviconUrl;  //non restituisce il valore di tabInfo[0].favIconUrl
    };

Ringrazio in anticipo per le risposte e la disponibilità
 

f107

Utente Attivo
7 Ago 2012
203
6
18
Roma
Ciao,
sicuro che non riesci a gestire il tutto nella callback della promise?
 

ken_korn

Nuovo Utente
27 Apr 2017
14
2
3
In che senso? Come da esempio ho provato ad assegnare un nuovo valore alla variabile fuori dalla Promise ma a quanto pare per qualche motivo non lo memorizza una volta finita la callback. Ho quindi pensato che ci fosse un problema di scope o di contesto (anche se il valore di this, sia dentro che fuori la Promise rimane sempre l'oggetto Window) ma non saprei proprio né qual'è né come risolverlo
 

f107

Utente Attivo
7 Ago 2012
203
6
18
Roma
Provo a spiegarmi meglio, purtroppo non ho il dono della chiarezza spesso :)

Tu provi ad assegnare il valore tabInfo[0].favIconUrl alla variabile faviconUrl nella callback onGot giusto?

Non ci riesci in quanto le promise sono asincrone, quindi l'assegnazione nella callback avviene dopo il return della funzione, e quindi immagino ti torni undefined.

Per cercare di spiegarmi meglio guarda qui: https://jsfiddle.net/u6w9d4gn/
Vedrai che ti darà 3 alert, nell'ordine in cui vengono eseguite le istruzioni, ho aggiunto anche un valore iniziale a faviconUrl per rendere più chiaro l'esempio.

Solitamente con le promise i dati si gestiscono nelle callback, quindi torniamo al mio primo post, non riesci a fare le tue operazioni con la faviconUrl nella callback onGot?
Una cosa simile
Codice:
function getFavicon(){

        var faviconUrl;
      
        function onGot(tabInfo){
            faviconUrl = tabInfo[0].favIconUrl;
            // scrivi qui le operazioni da fare con faviconUrl
        };
      
        var currentTab = browser.tabs.query({active:true, currentWindow:true});
        currentTab.then(onGot);
 
    };

Fammi sapere se sono riuscito a spiegarmi :)
 

ken_korn

Nuovo Utente
27 Apr 2017
14
2
3
F107, ti ringrazio enormemente per l'aiuto. Grazie a te non solo ho capito e risolto il mio problema ma ho imparato pure qualcosa in più sulle Promise e sulle operazioni asincrone, grazie!

Per chi si trovasse come me in errore:
L'errore era quello segnalato da F107 ovvero tentare di ottenere in una funzione sincrona un valore generato da una asincrona. Javascript non gestisce un vero multi-threading (i web workers si avvicinano all'idea ma in realtà non lo sono) quindi può processare solo un'informazione per volta. Dettò ciò, una funzione sincrona sarà sempre eseguita e completata PRIMA di quella asincrona che invece viene messa "in coda" nell'esecuzione dello script. Quindi le variabili definite in funzioni asincrone non sono visibili in quelle sincrone. Nel caso quindi si voglia processare in funzioni sincrone i valori ottenuti da quelle asincrone, bisognerà cambiare la struttura dello script e continuarlo tramite callback all'interno di queste ultime che rimandano ad altre funzioni (asincrone ovviamente) che continueranno il flusso del codice.
Io ad esempio, dato che lo script in cui dovevo effettuare questa operazione era già bello corposetto e doveva svolgere altre operazioni (sincrone), ho preferito crearne un altro ad hoc per questa operazione.

E dopo questa lunga spiegazione in cui spero non aver fatto errori tecnici troppo vistosi da programmatore dilettante quale sono, ecco lo script aggiornato:

Codice:
function getFavicon(){
    
    function getCurrentFavicon(tabInfo){
    
        favicon = tabInfo[0].favIconUrl;
        return favicon;
    
    };

    var currentTab = browser.tabs.query({active:true, currentWindow:true});
    var x = currentTab.then(getCurrentFavicon);
    x.then(afterGetFavicon);
        
    };


//In questa funzione sarà inserito il resto del codice
function afterGetFavicon(fav){
    
    alert(favicon);
    //continua qui il codice...
    
};

(anche se a mio modesto parere sembra strano che non ci siano modi più semplici per ottenere una semplice favicon dalle Web APIs)

Ringrazio nuovamente per l'aiuto
 
  • Like
Reactions: f107
Discussioni simili
Autore Titolo Forum Risposte Data
ken_korn [Javascript] Portare variabile in una funzione esterna al suo scope Javascript 2
L countdown multiplo javascript Javascript 1
S Problemi Javascript + Aruba Javascript 2
M Inviare un file su un server remoto con JavaScript Javascript 0
T a href="javascript:;" Javascript 0
F Creare elementi html con javascript Javascript 2
A pulsante di update campo mysql con javascript Javascript 2
8 Javascript - PDF Form Javascript 0
B javascript per problemi con pdf e Safari Javascript 0
N informazione javascript Programmazione 0
I Eecuzione di javascript in ciclo foreach php. PHP 7
P javascript:document.forms Javascript 7
S Consiglio esercizio Javascript Javascript 2
MarcoGrazia Aggiungere o rimuovere classi in javascript Javascript 1
P Passaggio id php a javascript PHP 6
E lettura da un Database con Javascript jQuery 2
V TRIS in javascript Javascript 1
IClaude Funzione Javascript Javascript 8
Alex_70 Javascript date color Javascript 3
F Convertire JavaScript per la compatibilità nei browser obsoleti Javascript 0
I Passare dei parametri in javascript PHP 0
Shyson Meglio Javascript o HTML? Javascript 4
M Chiamare pagina php da javascript Javascript 8
M Errore JavaScript per php [objeto HTMLParagraphElement] PHP 0
D Javascript per il download dei dati Javascript 0
grgfede Problema javascript con aruba Javascript 1
webmachine [PHP] [JAVASCRIPT] Form strano in HTML PHP PHP 1
W Modificare il Type di un Input box in javascript ovunque si trovi Javascript 0
I javascript come caricare una pagina sopra quella corrente in automatico Javascript 2
L [Javascript] Problema salvataggio dati in db Javascript 1
max1974 [Javascript] Grafico chartjs con dati da J.ajax Javascript 3
G Quiz Javascript Javascript 4
A [Javascript] Scrittura su più campi contemporaneamente Javascript 19
F classic asp popolare combo box javascript Presentati al Forum 1
claudio_lorenzo [Javascript] aiuto su jquery per calcolo altezze dom Javascript 1
F [Javascript] comando innerHTML non funziona Javascript 5
alexice51 proggrammi per scrivere in javascript? Javascript 3
max1974 [Javascript] Accordion aria-exspanded Javascript 0
D [Javascript] salvare immagine canvas - paypal Javascript 0
O [Javascript] Conflitto Jquery: forse... Javascript 0
M [Javascript] Canvas js css Javascript 1
M Programmazione web HTML, CSS e JavaScript Offerte e Richieste di Lavoro e/o Collaborazione 6
G [Javascript] Errore inserimento dati Backend Node.js e workbench Javascript 1
A Creare con Javascript un percorso all'interno di uno spazio Javascript 0
D [Javascript] inserire uno script in un file php Javascript 6
Monital [Javascript] inserire dati estratti dal db in html fisso Javascript 1
K [javascript] Tecnica per rilevare celle contenenti caratteri ricevute in dinamico Javascript 1
F [JavaScript] Ottenere il CSS dopo transform: scale() e transform-origin Javascript 0
S [Javascript] Problema costrutto if Javascript 0
I [Javascript] window.location.href porta alla nuova pagina e ritorna incomprensibilmente. Javascript 0

Discussioni simili