2017-11-11 14 views

答えて

0

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)") 
    } 
} 
関連する問題