我正在尝试使用 sqljocky 同步查询 MySQL 数据库。我有一个 Load 类,它运行查询并获取数据,然后将数据导入到 User 对象中。我遇到的问题是运行查询的 Future 没有及时返回以将对象返回到调用方法。
DataObject user = new DataObject();
user.Get(1234);
// I cannot do anything here because the returned object is null
user.somethingElse();
DataObject Get(String ID){
return access.Load(this, ID);
}
// Runs query
Load(DataObject object, String ID){
// Set up query
String query = 'select * from users where ID = \'' + ID + '\'';
// Run query
var completer = new Completer.sync();
pool.query(query).then((result) {
result.listen((row) {
// Import into object
object.Import(row);
}, onDone: () {
completer.complete(object);
});
});
}
最佳答案
我的猜测是你想做这样的事情(注意未经测试的代码):
Future<DBObject> load(DBObject object, String id) {
var query = "select ... where id='$id'"; // Note: check for SQL injection.
return pool.query(query)
.then((result) => result.toList())
.then((list) => list.forEach((row) => object.import(row)))
.then((_) => object);
}
你读过这篇文章吗article关于使用 future ?
关键点是,如果一个方法是异步的,并且调用代码需要等待它完成,那么它必须返回一个 Future 对象(或者在某些情况下返回一个 Stream)。 Dart 中没有办法让函数“阻塞”等待异步结果。欢迎在评论中提出更多问题。
关于mysql - sqljocky同步查询数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20411171/