2014-04-13 8 views
6

So che posso usare una variabile esterna per identificare lo stato con cui la funzione esterna deve fare. Ma considera questo: se la funzione interiore è asincrona? La funzione esterna non aspetterà che la variabile della funzione interna cambierà, quindi come posso restituire la funzione esterna adesso?JavaScript: come restituire una funzione esterna all'interno di una funzione interna asincrona?

function outer() { 
    var flag = true; 
    // For example, a jquery-like ajax call 
    $.ajax({ 
     // Some settings 
     error: function(jqXHR, textStatus, errorThrown) { 
      // Here I want to return outer() 
      flag = false; 
     } 
    }); 
    return flag; 
} 

Quindi, come si può vedere, se uso flag come valore di ritorno, outer() sarà molto probabilmente di ritorno vero, perché la chiamata AJAX può richiedere molto tempo. E per lo stesso motivo, non voglio impostare async: false perché ciò fermerà la reazione della pagina.

+1

Non è possibile con flussi asincroni, suggerirei di aggiungere un metodo callback come parametro a 'outer (cb)' che si chiama quando la richiesta ajax è completa. – olsn

+0

Sì hai ragione, stavo pensando male. – Melkor

risposta

6

La tua funzione outer verrà restituita immediatamente, quindi riceverai sempre il valore true come flag. Per ottenere il giusto valore, devi lasciare che la funzione asincrona faccia il suo lavoro e ti ricontatti quando è pronta. Considerate questo:

function outer(cb) { 
    var flag = true; 
    // For example, a jquery-like ajax call 
    $.ajax({ 
     // Some settings 
     error: function (jqXHR, textStatus, errorThrown) { 
      // Here I want to return outer() 
      flag = false; 
      cb(flag); 
     }, 
     success: function() { 
      flag = true; // or whatever value you need. 
      cb(flag); 
     } 
    }); 
} 

function callback(flag) { 
    // this function will be called after the ajax is complete. 
    // real value of flag variable will be available here 
    console.log(flag); 
} 
outer(callback); 

si passa una funzione come parametro alla funzione esterna, e si chiama quella funzione, quando l'Ajax si completa con il valore desiderato come parametro. In questo modo otterrai il risultato reale.

+0

Grazie, ma in realtà ho bisogno di restituirlo immediatamente. Ora mi rendo conto che è uguale a 'async: false'. Quindi troverò altri modi. – Melkor

Problemi correlati