如果希望按顺序处理包含异步处理的循环,可以使用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 を付ければ、そこで非同期処理の終了を待ってくれる
bannerAds