✅ – Pink Hat – 00-54 Feb 15

in this code
this.pattern = [
{
method: new Function(`console.log(1)`),
bulletDelay: 1000
} ,{
method: new Function(`console.log(2)`),
bulletDelay: 1000

} ,{
method: new Function(`console.log(3)`),
bulletDelay: 1000

}
]

for (this.i in this.pattern) {

setTimeout(()=>this.pattern[this.i].method(), function (i){
this.z = 0;
for (this.j = i-1; this.j >=0; this.j--) {
try {
this.z += this.pattern[this.j]?.bulletDelay
} catch (error) {
console.error(error)
} finally {
continue
}
}
console.log(i)
return this.z

}(this.i))
console.log(this.pattern[this.i])

}
this.pattern = [
{
method: new Function(`console.log(1)`),
bulletDelay: 1000
} ,{
method: new Function(`console.log(2)`),
bulletDelay: 1000

} ,{
method: new Function(`console.log(3)`),
bulletDelay: 1000

}
]

for (this.i in this.pattern) {

setTimeout(()=>this.pattern[this.i].method(), function (i){
this.z = 0;
for (this.j = i-1; this.j >=0; this.j--) {
try {
this.z += this.pattern[this.j]?.bulletDelay
} catch (error) {
console.error(error)
} finally {
continue
}
}
console.log(i)
return this.z

}(this.i))
console.log(this.pattern[this.i])

}
why does this.pattern[2] get printed 3 times?
> 0
> {bulletDelay: 1000, method: ƒ}
> 1
> {bulletDelay: 1000, method: ƒ}
> 2
> {bulletDelay: 1000, method: ƒ}
> undefined
> 3
> 3
> 3
> 0
> {bulletDelay: 1000, method: ƒ}
> 1
> {bulletDelay: 1000, method: ƒ}
> 2
> {bulletDelay: 1000, method: ƒ}
> undefined
> 3
> 3
> 3
When it should be printing
> 0
> {bulletDelay: 1000, method: ƒ}
> 1
> {bulletDelay: 1000, method: ƒ}
> 2
> {bulletDelay: 1000, method: ƒ}
> undefined
> 1
> 2
> 3
> 0
> {bulletDelay: 1000, method: ƒ}
> 1
> {bulletDelay: 1000, method: ƒ}
> 2
> {bulletDelay: 1000, method: ƒ}
> undefined
> 1
> 2
> 3
S
ScriptyChris428d ago
Try caching this.j as a local variable
PH
Pink Hat428d ago
caching it?
S
ScriptyChris428d ago
Yes, similarly as you do with i regarding this.i
PH
Pink Hat428d ago
like this?
for (this.i in this.pattern) {

setTimeout(()=>this.pattern[this.i].method(), function (i, j){
this.z = 0;
for (j >=0; j--) {
try {
this.z += this.pattern[j]?.bulletDelay
} catch (error) {
console.error(error)
} finally {
continue
}
}
console.log(i)
return this.z

}(this.i, 0))
console.log(this.pattern[this.i])

}
for (this.i in this.pattern) {

setTimeout(()=>this.pattern[this.i].method(), function (i, j){
this.z = 0;
for (j >=0; j--) {
try {
this.z += this.pattern[j]?.bulletDelay
} catch (error) {
console.error(error)
} finally {
continue
}
}
console.log(i)
return this.z

}(this.i, 0))
console.log(this.pattern[this.i])

}
S
ScriptyChris428d ago
}(this.i, 0)) -> }(this.i, this.j))
PH
Pink Hat428d ago
nothing still the same result
S
ScriptyChris428d ago
Can you add labels to console.log so it's more readable, which log refers to what value?
PH
Pink Hat428d ago
sure
S
ScriptyChris428d ago
console.log('i:', i)

console.log('this.pattern[this.i]:',this.pattern[this.i])
console.log('i:', i)

console.log('this.pattern[this.i]:',this.pattern[this.i])
And show output
PH
Pink Hat428d ago
S
ScriptyChris428d ago
Where's that "3" log coming from? Add it label too
PH
Pink Hat428d ago
the 3 is the label it was originally this
PH
Pink Hat428d ago
PH
Pink Hat428d ago
then so I could run it in chrome
this.pattern = [
{
method: new Function(`console.log(1)`),
bulletDelay: 1000
} ,{
method: new Function(`console.log(2)`),
bulletDelay: 1000

} ,{
method: new Function(`console.log(3)`),
bulletDelay: 1000

}
]
this.pattern = [
{
method: new Function(`console.log(1)`),
bulletDelay: 1000
} ,{
method: new Function(`console.log(2)`),
bulletDelay: 1000

} ,{
method: new Function(`console.log(3)`),
bulletDelay: 1000

}
]
Its a result of this.pattern[2] being run 3 times I think it's happening because this.i is already fully changed before the setTimeout occurs
S
ScriptyChris428d ago
Can you add counters to pattern too?
this.pattern = [
{
method: new Function(`console.log(1)`),
bulletDelay: 1000 ,
counter: 1,
} ,{
method: new Function(`console.log(2)`),
bulletDelay: 1000,
counter: 2,
} ,{
method: new Function(`console.log(3)`),
bulletDelay: 1000,
counter: 3,
}
]
this.pattern = [
{
method: new Function(`console.log(1)`),
bulletDelay: 1000 ,
counter: 1,
} ,{
method: new Function(`console.log(2)`),
bulletDelay: 1000,
counter: 2,
} ,{
method: new Function(`console.log(3)`),
bulletDelay: 1000,
counter: 3,
}
]
Show the console output - i suppose each pattern will have counter: 3 Yes You could await timeout call
PH
Pink Hat428d ago
in the for function?
S
ScriptyChris428d ago
for (this.i in this.pattern) {

await new Promise(resolve => setTimeout(()=>this.pattern[this.i].method(), function (i, j){
// stuff

// `return this.z` becomes
resolve(this.z)
}(this.i, 0))
console.log(this.pattern[this.i])
}
for (this.i in this.pattern) {

await new Promise(resolve => setTimeout(()=>this.pattern[this.i].method(), function (i, j){
// stuff

// `return this.z` becomes
resolve(this.z)
}(this.i, 0))
console.log(this.pattern[this.i])
}
PH
Pink Hat428d ago
would that work?
S
ScriptyChris428d ago
It should
PH
Pink Hat428d ago
ok. I'll try it
S
ScriptyChris428d ago
If this for..in is inside a function, then you have to make it async If it's in top-level scope, then your script should work as a module, otherwise await won't work, and you have to .then() the promise
PH
Pink Hat428d ago
and inside the .then you would put what exactly? because it seems the await doesnt have anything referencing it
S
ScriptyChris428d ago
Your console.log
PH
Pink Hat428d ago
ok.
S
ScriptyChris428d ago
What do you mean?
PH
Pink Hat428d ago
nvm that so
PH
Pink Hat428d ago
PH
Pink Hat428d ago
now it's worse it doesnt even wait the time it needs to
S
ScriptyChris428d ago
No, you have to wrap console.log inside a function, which you pass to .then() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then#using_the_then_method .then(), same as setTimeout() or Promise() expects a function to be passed, which is then called inside
PH
Pink Hat428d ago
huh? what do u mean by this im confused as hell
S
ScriptyChris428d ago
Read example in the docs
S
ScriptyChris428d ago
Passing a function
S
ScriptyChris428d ago
.then((value) => console.log( /* stuff */ ))
PH
Pink Hat428d ago
I want the promise to pass after a certain time. if I do
new Promise(resolve).then(() => console.log(/* stuff */)
new Promise(resolve).then(() => console.log(/* stuff */)
then what does that do
S
ScriptyChris428d ago
What resolve is there? I already wrote you example with promisified setTimeout above ..ok, try this - i think i misread your code (2:30am on my side)
await new Promise(
(resolve) => {
setTimeout(
() => {
this.pattern[this.i].method();
resolve();
},
function (i, j){
// stuff

return this.z;
}(this.i, 0)
)
}
)
console.log(this.pattern[this.i])
await new Promise(
(resolve) => {
setTimeout(
() => {
this.pattern[this.i].method();
resolve();
},
function (i, j){
// stuff

return this.z;
}(this.i, 0)
)
}
)
console.log(this.pattern[this.i])
PH
Pink Hat428d ago
threw this error (after I fixed some of the syntax cus it was complaining
S
ScriptyChris428d ago
Lacking closing curly brace
S
ScriptyChris428d ago
Add } there
S
ScriptyChris428d ago
And the console.log('what') is incorrectly place there Just copy-paste this ☝️
S
ScriptyChris428d ago
Works for me on dry-run
PH
Pink Hat428d ago
it works
S
ScriptyChris428d ago
👍
PH
Pink Hat428d ago
I found a piece of code that works (slightly waltered from yours)
this.pattern = [
{
method: new Function('console.log("Counter: 1")'),
bulletDelay: 1000
} ,{
method: new Function('console.log("Counter: 2")'),
bulletDelay: 1000

} ,{
method: new Function('console.log("Counter: 3")'),
bulletDelay: 1000

}
]

for (this.i in this.pattern) {
await new Promise(
(resolve) => {
setTimeout(
() => {
this.pattern[this.i].method();
resolve();
},
function (i, j){
// stuff

return this.z;
}(this.i, 0)
)
console.log(this.pattern[this.i])
});
}
this.pattern = [
{
method: new Function('console.log("Counter: 1")'),
bulletDelay: 1000
} ,{
method: new Function('console.log("Counter: 2")'),
bulletDelay: 1000

} ,{
method: new Function('console.log("Counter: 3")'),
bulletDelay: 1000

}
]

for (this.i in this.pattern) {
await new Promise(
(resolve) => {
setTimeout(
() => {
this.pattern[this.i].method();
resolve();
},
function (i, j){
// stuff

return this.z;
}(this.i, 0)
)
console.log(this.pattern[this.i])
});
}
and now we can close this. thanks for the help @ScriptyChris #thanks
S
ScriptyChris428d ago
You may react to helpful answer with ✅ to mark thread as solved
UU
Unknown User428d ago