wait_for()
Wait for the selected event to happen before proceeding.
Method Syntaxdb.wait_for(event)
Argument | Type | Description | |||
---|---|---|---|---|---|
event | WaitFor | The event to wait for before proceeding. |
WaitFor
is a simple enum with two variants representing the event to wait for.
pub enum WaitFor { Connection, Database, }
The following test from the source code demonstrates the behaviour of the .wait_for_()
method in a variety of situations.
use std::task::Poll; use surrealdb::engine::remote::ws::{Client, Ws}; use surrealdb::opt::auth::Root; use surrealdb::opt::WaitFor::{Connection, Database}; use surrealdb::Surreal; use futures::poll; use std::pin::pin; async fn main() -> surrealdb::Result<()> { // Create an unconnected client // At this point wait_for should continue to wait for both the connection and database selection. let db: Surreal<Client> = Surreal::init(); assert_eq!(poll!(pin!(db.wait_for(Connection))), Poll::Pending); assert_eq!(poll!(pin!(db.wait_for(Database))), Poll::Pending); // Connect to the server // The connection event should fire and allow wait_for to return immediately when waiting for a connection. // When waiting for a database to be selected, it should continue waiting. db.connect::<Ws>("127.0.0.1:8000").await.unwrap(); assert_eq!(poll!(pin!(db.wait_for(Connection))), Poll::Ready(())); assert_eq!(poll!(pin!(db.wait_for(Database))), Poll::Pending); // Sign into the server // At this point the connection has already been established but the database hasn't been selected yet. db.signin(Root { username: "root", password: "root", }) .await .unwrap(); assert_eq!(poll!(pin!(db.wait_for(Connection))), Poll::Ready(())); assert_eq!(poll!(pin!(db.wait_for(Database))), Poll::Pending); // Selecting a namespace shouldn't fire the database selection event. db.use_ns("namespace").await.unwrap(); assert_eq!(poll!(pin!(db.wait_for(Connection))), Poll::Ready(())); assert_eq!(poll!(pin!(db.wait_for(Database))), Poll::Pending); // Select the database to use // Both the connection and database events have fired, wait_for should return immediately for both. db.use_db("database").await.unwrap(); assert_eq!(poll!(pin!(db.wait_for(Connection))), Poll::Ready(())); assert_eq!(poll!(pin!(db.wait_for(Database))), Poll::Ready(())); Ok(()) }