如果希望按顺序处理包含异步处理的循环,可以使用AsyncAwait来简洁地编写代码段
首先
就在不久之前,我才以为 Node.js 的 LTS 版本升级到了 6 系列,结果距离下一个 LTS 版本(8 系列)的发布只剩下大约一个月的时间了。
终于等到了期待已久的 AsyncAwait 的推出!
本文为一篇中文的同义转述题目。
以下是一个示例,告诉你以前一直很麻烦的异步处理串行循环,在AsyncAwait中会变得很清晰简洁。
在MongoDB中,以将一个集合的内容复制到另一个集合为例子。
(保留不相关字段的值)
我们正在使用Node.js 8.2、MongoDB 3.4和2.2版本的驱动程序。
const mongodb = require('mongodb');
const uri = process.env.MONGO_URI || 'mongodb://127.0.0.1:27017/test?max_pool_size=1';
// コレクションのコピー
const copy = async (db, from, to) => {
const src = db.collection(from);
const dst = db.collection(to);
const cond = {}; // 検索条件
const cursor = src.find(cond);
const update = (c) => {
return c.next().then(obj => {
const { _id } = obj;
return dst.updateOne({ _id }, { $set: obj }, { upsert: true });
});
};
while (await cursor.hasNext()) {
await update(cursor);
}
};
// メイン
let db;
mongodb.MongoClient.connect(uri).then(_db => {
db = _db;
return copy(db, 'data_src', 'data_dst');
}).then(() => {
db && db.close();
process.exit(0);
}).catch(e => {
db && db.close();
process.exit(-1);
});
总结
最后,重要的是
-
「async 関数」は、実行することで promise になる
await は async 関数内部だけで有効なキーワード
promise に await を付ければ、そこで非同期処理の終了を待ってくれる