1

期待どおりに機能する次の機能があります。

  createObjectFrom(record) {
    let obj = {};

    this.opts.transformers.forEach((transformer, index) => {
      const headerIndex = findIndex(this.headers, (header) => {
        return header === transformer.column;
      });

      const value = transformer.formatter(record[headerIndex]);

      obj[transformer.field] = value;
    });

    return obj;
  }

async await を使用するようにリファクタリングし、次のように forEach の本体で async 関数を呼び出します。

  createObjectFrom(record) {
    let obj = {};

    this.opts.transformers.forEach(async (transformer, index) => {
      const headerIndex = findIndex(this.headers, (header) => {
        return header === transformer.column;
      });

      const result = await this.knex('managers').select('name')

      console.log(result);

      const value = transformer.formatter(record[headerIndex]);

      obj[transformer.field] = value;
    });

    return obj;
  }

forEach が非同期で実行され、関数が実行されて終了するため、これは明らかに関数を壊します。

forEach を同期的に実行するために async await を使用する方法はありますか。ジェネレーターにリファクタリングできますか?

4

1 に答える 1

1

非同期動作を待機する通常の JS 関数を強制することはできません。道はない!

したがって、createObjectFrom非同期になるようにリファクタリングする必要があります。そして、おそらく forEach の代わりに map/reduce を選択します。パフォーマンスを向上させるために、これを行いたくありません:

for(transformer of this.opts.transformers) {
    await this.knex('managers').select('name');
}

代わりに を使用する必要がありますawait Promise.all(...)

ただし、あなたの場合、knex への呼び出しはトランスフォーマーに依存していないように見えるため、これを行うことができます。

async createObjectFrom(record) {
  let obj = {};

  const result = await this.knex('managers').select('name')

  this.opts.transformers.forEach(async (transformer, index) => {
    const headerIndex = findIndex(this.headers, (header) => {
      return header === transformer.column;
    });

    console.log(result);

    const value = transformer.formatter(record[headerIndex]);

    obj[transformer.field] = value;
  });

  return obj;
}

ただし、アイテムごとにフェッチのようなことをしたい場合は、非同期で次のようにします。

async foo(data) {
  const subDataArr = await Promise.all(data.map(record => loadSubData(record)));

  return subDataArr;
}
于 2016-09-03T22:12:43.050 に答える