等待将来完成

Dan*_*ani 4 dart dart-async

我使用postgres数据库查询来确定我的下一个操作.我需要等待结果才能执行下一行代码.现在我conn.query返回一个Future,但是当我将代码放在另一个函数中时,我无法将其设置为异步.

main() {
  // get the database connection string from the settings.ini in the project root folder 
  db = getdb();
  geturl().then((String url) => print(url));
}

Future geturl() {
  connect(db).then((conn) {
    conn.query("select trim(url) from crawler.crawls where content IS NULL").toList()
      .then((result) { return result[0].toString(); })
      .catchError((err) => print('Query error: $err'))
      .whenComplete(() {
        conn.close();
      });
  });
}
Run Code Online (Sandbox Code Playgroud)

我只是想geturl()等待返回的值,但无论我做什么; 它会立即发射.任何人都能指出我的一篇文档解释了我在这里缺少的东西吗?

Pix*_*ant 8

你目前还没有真正回归未来geturl.您必须实际返回您使用的期货:

Future geturl() {
  return connect(db).then((conn) {
    return conn.query("select trim(url) from crawler.crawls where content IS NULL").toList()
      .then((result) { return result[0].toString(); })
      .catchError((err) => print('Query error: $err'))
      .whenComplete(() {
        conn.close();
      });
  });
}
Run Code Online (Sandbox Code Playgroud)


Gre*_*owe 6

要详细说明John的评论,以下是使用async/await实现这一点的方法.(在Dart 1.9中添加了async/await功能)

main() async {
  try {
    var url = await getUrl();
    print(url);
  } on Exception catch (ex) {
    print('Query error: $ex');
  }
}

Future getUrl() async {
  // get the database connection string from the settings.ini in the project root folder 
  db = getdb();
  var conn = await connect(db);
  try {      
    var sql = "select trim(url) from crawler.crawls where content IS NULL";
    var result = await conn.query(sql).toList();
    return result[0].toString();
  } finally {
     conn.close();
  }
}
Run Code Online (Sandbox Code Playgroud)