2013-08-24 10 views
12

è possibile creare il proprio futuro in Dart per tornare dai propri metodi, o si deve sempre restituire un ritorno futuro generato da uno dei metodi delle librerie asincrone di dardo?Dart, come creare un futuro da restituire nelle proprie funzioni?

voglio definire una funzione che restituisce sempre un Future<List<Base>> se la sua realtà facendo una chiamata asincrona (file di lettura/Ajax/etc) o semplicemente ottenere una variabile locale, come di seguito:

List<Base> aListOfItems = ...; 

Future<List<Base>> GetItemList(){ 

    return new Future(aListOfItems); 

} 

risposta

20

Se avete bisogno per creare un futuro, è possibile utilizzare un Completer. Vedi Completer class nei documenti. Ecco un esempio:

Future<List<Base>> GetItemList(){ 
    var completer = new Completer(); 

    // At some time you need to complete the future: 
    completer.complete(new List<Base>()); 

    return completer.future; 
} 

Ma la maggior parte del tempo che non hanno bisogno di creare un futuro con una più completa. Come in questo caso:

Future<List<Base>> GetItemList(){ 
    var completer = new Completer(); 

    aFuture.then((a) { 
    // At some time you need to complete the future: 
    completer.complete(a); 
    }); 

    return completer.future; 
} 

Il codice può diventare molto complicato utilizzando i completatori. Si può semplicemente utilizzare il seguente, invece, a causa then() restituisce una Future, troppo:

Future<List<Base>> GetItemList(){ 
    return aFuture.then((a) { 
    // Do something.. 
    }); 
} 

Oppure un esempio per il file IO:

Future<List<String>> readCommaSeperatedList(file){ 
    return file.readAsString().then((text) => text.split(',')); 
} 

Vedere this blog post per ulteriori suggerimenti.