2013-04-21 4 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

Смежные вопросы