【问题标题】:Dart - Help me understand how this code on Dart worksDart - 帮助我了解 Dart 上的这段代码是如何工作的
【发布时间】:2014-10-24 08:18:12
【问题描述】:

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

示例中的变量resStream<Row>

我想从processQueryResult 方法返回Future<List>。这段代码可以正常工作,我得到的结果是正确的。

示例 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 - 我得到空列表。

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

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

【问题讨论】:

    标签: dart dart-async


    【解决方案1】:
    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
      });
    });
    

    【讨论】:

    • 非常感谢您的帮助!你是 stackoverflow 上最酷的人!
    • 谢谢!很高兴我能帮上忙。
    猜你喜欢
    • 2022-12-12
    • 2011-02-21
    • 1970-01-01
    • 2020-10-14
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多