2013-04-21 40 views
2

假設我們的目標是建立一個List,我們將其稱爲storedResult如何存儲未來的結果供以後使用

我們有一個Future<List>返回函數調用多次:

Future<List> getList()... 

假設,我們將調用我們的getList()功能未知多次,並希望每個List的結果存儲到我們storedResult

List storedResult = []; 

someOtherList.forEach((element)){ 
    getList().then((resultingList)){ 
     storedResult.addAll(resultingList); 
    } 
} 

print(storedResult); 

如果我們運行此代碼,它將打印爲[]。我們如何表達這種以便結果是相當:

[resultingList, resultingList, ..., ] 

回答

3

記住,期貨立即返回,但其相關的回調異步運行。具體而言,getList()所做的工作(以及所有then所做的工作)在執行返回到事件循環之前不會發生。

你的問題是你試圖同步打印一個異步操作的結果,這是行不通的。

如果你想使用存儲的結果,那麼你應該做的是一樣的東西:

Future<List<List>> globFutures(List someOtherList) { 
    List<Future> futures = []; 
    someOtherList.forEach((element) { 
    futures.add(getList()); 
    }); 

    // Automatically completes to a List containing all the 
    // results of all of the futures. 
    return Future.wait(futures); 
} 

main() { 
    var storedResults = []; 

    globFutures(someOtherList) 
    .then((List<List> results) { 
     storedResults = results; 

     // Run code in here that depends on storedResults being available. 
     print(storedResults); 
    }); 

    // Do **NOT** use storedResults here, as it will be []. 
    // The Future functions have not yet run! 
    assert(storedResults == []); 
}; 
+0

太謝謝你了!很有幫助! – Damon 2013-04-21 14:45:40

相關問題