title: async/await race condition related to `forEach` use?
body: <p>I have the following async function:</p>
  
  <pre><code>async function createDemoContent({ orgId, userId }) {
    const createTag = promisifyMethod(_createTag);
    const tags = {};
  
    /* ... */
    [
      'marketing',
      'insights',
      'customer-centric',
      'email marketing',
      'click through rate',
      'tests',
      'research',
      'UX'
    ].forEach(async (label) =&gt; {
      const tag = await createTag({
        demo: true,
        label,
        orgId,
      });
  
      tags[label] = tag._id;
    });
  
    console.log('all tags:', JSON.stringify(tags));
  </code></pre>
  
  <p>And just in case anyone wants to see <code>promisifyMethod</code> (it converts a Meteor method to a promisified function call):</p>
  
  <pre><code>export function promisifyMethod(method: Object) {
    return (...args: Array&lt;any&gt;) =&gt; {
      return new Promise((resolve: Function, reject: Function) =&gt; {
        method.call(...args, (error: Object, result: any) =&gt; {
          if (!error) resolve(result);
          else reject(error);
        });
      });
    }
  }
  </code></pre>
  
  <p>For some reason, the <code>tags</code> object is shown as being an empty object. There must be something wrong with my usage of <code>async</code>/<code>await</code> where the <code>console.log</code> is being hit before even the first property is added to the <code>tags</code> object. But I have several <code>await</code> calls above this <code>forEach</code> and those seem to work just fine.</p>
  
  <p>This is the code for <code>createTag</code>:</p>
  
  <pre><code>export const createTag = new ValidatedMethod({
    name: 'createTag',
  
    validate: new SimpleSchema({
      demo: { type: Boolean, optional: true },
      label: String,
      orgId: String,
    }).validator(),
  
    run(args) {
      const tag = new Tag(args);
  
      tag.save();
      return tag;
    },
  });
  </code></pre>