在 Dart 中,通过仅存在于回调内部的 collection/list `yield` 的最佳方法是什么?
What is the best way to `yield` over a collection/list that only exists inside of a callback, in Dart?
我有一个方法 (_all
),里面有一个回调 (_runInTxn
)。回调获取我想要 yield
的列表 (rs
) 和 return 通过 _all 的流。但是,回调未标记为 async*
(但该方法标记为 async*
)。
通过仅存在于回调内部的 collection/list 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'];
}
}
我很好奇是否有更好的方法来编写这段代码,这样我就可以避免空 resultSet
。我真的很想在 executeSql
声明中包含我的 yield
声明。我可以做一个 "non-local yield" 吗?
关于在 Future.forEach()
中使用 yield
也有类似的讨论,据我所知,答案是不支持(还找不到讨论)。
我想如果没有异步会更容易*
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
我有一个方法 (_all
),里面有一个回调 (_runInTxn
)。回调获取我想要 yield
的列表 (rs
) 和 return 通过 _all 的流。但是,回调未标记为 async*
(但该方法标记为 async*
)。
通过仅存在于回调内部的 collection/list 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'];
}
}
我很好奇是否有更好的方法来编写这段代码,这样我就可以避免空 resultSet
。我真的很想在 executeSql
声明中包含我的 yield
声明。我可以做一个 "non-local yield" 吗?
关于在 Future.forEach()
中使用 yield
也有类似的讨论,据我所知,答案是不支持(还找不到讨论)。
我想如果没有异步会更容易*
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