2014-10-24 3 views
2

Пожалуйста, помогите мне понять, как работает этот код. И почему это так.Dart - Помогите мне понять, как работает этот код на Dart

Переменные res в примере Stream<Row>.

Я хочу вернуть Future<List> из processQueryResult метод. Этот код работает так, как должен, и результат, который я получаю, правильный.

Пример 1

Future<List> processQueryResult(mysql.Results res) { 
    List data = []; 

    res.toList().then((List<mysql.Row> rows) { 
    rows.forEach((mysql.Row row) { 
     data.add({name: row.name, email: row.email}); 
    }); 
    }); 

    return new Future<List>(() { 
    return data; 
    }); 
} 

В результате data содержит все нужны данные.

Но скажите мне, пожалуйста, почему, когда я перехожу эту часть кода

res.toList().then((List<mysql.Row> rows) { 
    rows.forEach((mysql.Row row) { 
    data.add({name: row.name, email: row.email}); 
    }); 
}); 

Для

return new Future<List>(() { 

    res.toList().then((List<mysql.Row> rows) { 
    rows.forEach((mysql.Row row) { 
     data.add({name: row.name, email: row.email}); 
    }); 
    }); 

    return data; 

}); 

Наконец код посмотреть, что (Пример 2):

Future<List> processQueryResult(mysql.Results res) { 
    List data = [];  

    return new Future<List>(() { 
    res.toList().then((List<mysql.Row> rows) { 
     rows.forEach((mysql.Row row) { 
     data.add({name: row.name, email: row.email}); 
     }); 
    }); 

    return data; 
    }); 
} 

Затем в результате я получаю пустой список.

Для теста я использую эту функцию:

testResult() { 

    mysql.Results res = ... // get results; 
    processQueryResult(res).then((data) { 
    print(data); 
    }) 

} 

Когда код processQueryResult как Пример 1, то я получить правильные данные, но когда код processQueryResult как Пример 2 - я получаю пустой список ,

Скажите, пожалуйста, почему это происходит?

Я был бы рад, если вы дадите ссылку на соответствующую статью или документацию.

ответ

2
return new Future<List>(() { 

    res.toList() // <== 1.) registers a future for later execution // <== 3.) execute `toList()` 
    .then((List<mysql.Row> rows) { 
    rows.forEach((mysql.Row row) { // <== 4.) execute rows.forEach 
     data.add({name: row.name, email: row.email}); 
    }); 
    }); 

    return data; // <== 2.) return data 

}); 

3.) выполняется после того, как код, вызывающий код выше завершил все синхронизации выполнения

return new Future<List>(() { 

    return res.toList() // <== returning the future keeps the async parts connected 
         // and one is executed after the other 
    .then((List<mysql.Row> rows) { 
     rows.forEach((mysql.Row row) { // <== 4.) execute rows.forEach 
     data.add({name: row.name, email: row.email}); 
     }); 
    }) 
    .then((_) data); // <== the same here, return data **after** the previous statements are finished 
    }); 
}); 
+0

Спасибо большое за помощь! Вы самый крутой человек в stackoverflow! –

+0

Спасибо! Рад, что смог помочь. –

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