我有一个方法(_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
声明。我可以做一个“非本地收益”吗?
答案 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