Skip to content

for loop, inside async setter doesn't wait all Promise. #3898

Closed
@duecorda

Description

@duecorda

Version

v16.15.1

Platform

Linux ubuntu 5.13.0-51-generic nodejs/node#58~20.04.1-Ubuntu SMP Tue Jun 14 11:29:12 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Subsystem

No response

What steps will reproduce the bug?

It should return { q: 'q', w: 'w', e: 'e', r: 'r', a: 'a'}
But { q: 'q', w: 'w' } or { q: 'q', w: 'w', e: 'e' }, depends on your system.

class Foo {
  static async build(attrs={}) {
    const _instance = new this();
    await (_instance.attributes = attrs);
    return _instance;
  }

  constructor() {
    this.props = {};

    Object.defineProperty(this, 'attributes', {
      get() {
        return this.props;
      },
      async set(attrs) {
        for (const k in attrs) {
          await (this.props[k] = attrs[k]);
        };
      }
    });
  }
}

async function main() {
  const attrs = { q: 'q', w: 'w', e: 'e', r: 'r', a: 'a'};
  const foo = await Foo.build(attrs);
  console.log(foo.attributes); // incomplete.
};

main();

for...of returns same result.

for (const kv of Object.entries(attrs)) {
  await (this.props[kv[0]] = kv[1]);
}

But it works Object.keys...forEach

Object.keys(attrs).forEach(async (k) => {
  await (this.props[k] = attrs[k]);
});

and works too Object.entries...map

Object.entries(attrs).map(async (kv) => {
  await (this.props[kv[0]] = kv[1]);
});

How often does it reproduce? Is there a required condition?

Everytime.

What is the expected behavior?

{ q: 'q', w: 'w', e: 'e', r: 'r', a: 'a' }

What do you see instead?

{ q: 'q', w: 'w', e: 'e' }

Additional information

As I wrote, I can loop with Object.keys.
but I've spent several hours to find this problem.
If I'm not wrong with that code - using for..in loop inside async setter - hope it fixed.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions