Dart - 帮助我理解 Dart 上的这段代码是如何工作的

标签 dart dart-async

请帮助我理解这段代码是如何工作的。以及为什么会这样。

变量 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/

相关文章:

dart - 在 polymer.dart 中使用聚合物的 `.job`

dart - Dart 中惯用的流?

dart - 流相当于 Observable.Throttle?

firebase - 从firestore映射到StreamBuilder => ListView.Builder

xcode - 如何解决在Xcode上构建Archive时找不到的头文件?

flutter - 如何等待一个已经在执行的方法?

dart - 等待我的类初始化(或者如何等待 Future 完成)?

dart - 如何使用流发送http响应

android - getApplicationDocumentsDirectory 不适用于 flutter 桌面(Windows)

flutter - 如何清除 flutter 中除 2 个键之外的所有 SharedPreferences 键