请帮助我理解这段代码是如何工作的。以及为什么会这样。
变量 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 - 我得到空列表。
请告诉我,为什么会发生这种情况?
如果您提供相应文章或文档的链接,我将非常高兴。
最佳答案
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
});
});
关于Dart - 帮助我理解 Dart 上的这段代码是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26543997/