Node.js
非同期/待機中
サーチ…
前書き
Async / awaitは、コールバック( コールバック・ヘル )やプロミス・チェーン( .then().then().then()
)に頼ることなく、非同期コードを手続き的に書くことを可能にするキーワードのセットです。
これは、 await
キーワードを使用しawait
、約束の解決まで非同期関数の状態を一時停止し、 async
キーワードを使用して約束を返すような非同期関数を宣言することによって機能します。
Async / awaitはデフォルトでnode.js 8から使用可能です。または、 --harmony-async-await
フラグを使用して7から使用できます。
Try-Catchエラー処理による非同期関数
async / await構文の最も優れた機能の1つは、同期コードを記述するのと同じように、標準的なtry-catchコーディングスタイルが可能であることです。
const myFunc = async (req, res) => {
try {
const result = await somePromise();
} catch (err) {
// handle errors here
}
});
Expressとpromise-mysqlの例を以下に示します。
router.get('/flags/:id', async (req, res) => {
try {
const connection = await pool.createConnection();
try {
const sql = `SELECT f.id, f.width, f.height, f.code, f.filename
FROM flags f
WHERE f.id = ?
LIMIT 1`;
const flags = await connection.query(sql, req.params.id);
if (flags.length === 0)
return res.status(404).send({ message: 'flag not found' });
return res.send({ flags[0] });
} finally {
pool.releaseConnection(connection);
}
} catch (err) {
// handle errors here
}
});
約束と非同期/待機の比較
約束を用いた機能:
function myAsyncFunction() {
return aFunctionThatReturnsAPromise()
// doSomething is a sync function
.then(result => doSomething(result))
.catch(handleError);
}
したがって、Async / Awaitが実際に機能を果たすためには、次のようになります。
async function myAsyncFunction() {
let result;
try {
result = await aFunctionThatReturnsAPromise();
} catch (error) {
handleError(error);
}
// doSomething is a sync function
return doSomething(result);
}
したがって、キーワードasync
は、 return new Promise((resolve, reject) => {...}
ます)と似ています。
そしてthen
コールバックであなたの結果を得るawait
似てawait
ます。
ここで私はそれを見た後に心に残っていないかなり簡単なgifを残す:
コールバックからの進展
最初はコールバックがあり、コールバックはOKでした:
const getTemperature = (callback) => {
http.get('www.temperature.com/current', (res) => {
callback(res.data.temperature)
})
}
const getAirPollution = (callback) => {
http.get('www.pollution.com/current', (res) => {
callback(res.data.pollution)
});
}
getTemperature(function(temp) {
getAirPollution(function(pollution) {
console.log(`the temp is ${temp} and the pollution is ${pollution}.`)
// The temp is 27 and the pollution is 0.5.
})
})
しかし、コールバックには本当に不満な問題がいくつかあったので、私たちはすべて約束を使用し始めました。
const getTemperature = () => {
return new Promise((resolve, reject) => {
http.get('www.temperature.com/current', (res) => {
resolve(res.data.temperature)
})
})
}
const getAirPollution = () => {
return new Promise((resolve, reject) => {
http.get('www.pollution.com/current', (res) => {
resolve(res.data.pollution)
})
})
}
getTemperature()
.then(temp => console.log(`the temp is ${temp}`))
.then(() => getAirPollution())
.then(pollution => console.log(`and the pollution is ${pollution}`))
// the temp is 32
// and the pollution is 0.5
これはちょっと良かったです。最後に、async / awaitが見つかりました。これはまだフードの下で約束を使用しています。
const temp = await getTemperature()
const pollution = await getAirPollution()
実行待ちを待つ
約束が何も返されない場合、非同期タスクは待機を使用しawait
完了することができます。
try{
await User.findByIdAndUpdate(user._id, {
$push: {
tokens: token
}
}).exec()
}catch(e){
handleError(e)
}