sqljocky querying database synchronously

2019-02-19 20:43发布

问题:

I am trying to query a MySQL database synchronously with sqljocky. I have a Load class that runs the query and gets the data then imports the data into a User object. The problem I am having is the Future that runs the query is not returning in time to return the object to the calling method.

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);
    });
  });
}

回答1:

My guess is you want to do something like this (Note untested code):

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);
}

Have you read this article about using Futures?

The key point is if a method is asynchronous, and the calling code needs to wait for it to complete, then it must return a Future object (or a Stream in some cases). There is no way in Dart to get a function to "block" waiting for an asynchronous result. Feel free to ask some more questions in the comments.



标签: mysql dart