await
関数を使用すると、ノードは非同期r.table(...
コマンドが返されるのを待ってから次のコード行に進みます。つまり、論理的には同期コードと同じように動作します。
RethinkDBが指定されたキーを持つ最初の「ユーザー」ドキュメントを検出したときに、特定のコマンドが返されます。結果が見つからない場合は「停止」する必要はなく、(a)結果を見つけたり、(b)テーブル全体をスキャンし終えるとすぐに停止します。
一般にノード/ javascriptで非同期コードを「停止」することはできませんが、非同期メソッドを待つ時間を制限することができます。次に、Promise.race()関数を使用した例を示します。
/*
* toy async function
*
* returns a promise that resolves to the specified number `n`
* after the specified number of seconds `s` (default 2)
*/
const later = (n, s=2) => {
return new Promise(resolve => {
setTimeout(() => resolve(n), s*1000);
})
}
/*
* returns a promise that rejects with `TIMEOUT_ERROR` after the
* specified number of seconds `s`
*/
const timeout = (s) => {
return new Promise((resolve, reject) => {
setTimeout(() => reject("TIMEOUT_ERROR"), s*1000)
})
}
/*
* Example 1: later finished before timeout
* later resolves after 1 second, timeout function rejects after 3 seconds
* so we end up in the `.then` block with `val == 42`
*/
Promise.race([later(42, 1), timeout(3)])
.then(val => {
// do somethign with val...
console.log(val)
}).catch(err => {
if (err === "TIMEOUT_ERROR") {
console.log("we timed out!")
} else {
consle.log("something failed (but it was not a timeout)")
}
});
/*
* Example 2 (using async/await syntax): we timeout before later returns.
* later resolves after 3 seconds, timeout function rejects after 2 seconds
* so we end up in the `.catch` block with `err == "TIMEOUT_ERROR"`
*/
try {
const val = await Promise.race([later(11, 3), timeout(2)]);
// do something with val...
} catch (err) {
if (err === "TIMEOUT_ERROR") {
console.error("we timed out!")
} else {
console.error("something failed (but it was not a timeout)")
}
}