在Dart中仅在回调内存在的集合/列表上“产生”的最佳方法是什么?

时间:2015-03-29 15:35:28

标签: dart dart-async

我有一个方法(_all)里面有一个回调(_runInTxn)。回调获取我希望rs结束并通过_all的Stream返回的列表(yield)。但是,回调未标记为async*(但该方法标记为async*)。

yield对仅存在于回调中的集合/列表的最佳方法是什么?

这是一个正确和有效的例子:

  Stream<String> _all() async* {
    var sql = 'SELECT id,value FROM $storeName';
    SqlResultSet resultSet;

    await _runInTxn((txn) {
      txn.executeSql(sql, [], (txn, rs) {
        resultSet = rs;
      });
    });

    for (var i = 0; i < resultSet.rows.length; ++i) {
      var row = resultSet.rows.item(i);
      yield row['value'];
    }
  }

我很好奇是否有更好的方法来编写此代码,因此我可以避免使用null resultSet。我真的很想在yield声明中加入executeSql声明。我可以做一个“非本地收益”吗?

1 个答案:

答案 0 :(得分:1)

关于在yield中使用Future.forEach()进行了类似的讨论,答案就是我记得不支持(暂时找不到讨论)。

我想如果没有async *

会更容易
Stream<String> _all() {
  var sql = 'SELECT id,value FROM $storeName';
  var sc = new StreamController<String>();

  _runInTxn((txn) {
    txn.executeSql(sql, [], (txn, rs) {
      rs.rows.forEach((row) => sc.add(row['value']));
    });
  }).then((_) => sc.close());

  return sc.stream;
}

尝试DartPad