2

请帮助我了解此代码的工作原理。以及为什么会这样。

示例中的变量resStream<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);
  })

}

示例 1processQueryResult的代码时,我得到正确的数据,但是当示例 2的代码时 -我得到空列表。processQueryResult

请告诉我,为什么会这样?

如果您提供指向相应文章或文档的链接,我将很高兴。

4

1 回答 1

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.) is executed after the code calling the above code has finished all sync execution

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
  });
});
于 2014-10-24T08:33:31.003 回答