Closed
Description
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
Labels
No labels