I am a JavaScript beginner. have an async function, that has an await method in it, problem is that after obtaining the return value from that async function when I am passing it as a parameter to another function and iterating over it using a forEach it says data.ForEach is not a function
Here is my code
async function javed(){
var map1 = new Map();
map1 = await createMap();
return map1;
}
function createMap(){
var map2 = new Map();
map2.set('11', true);
map2.set('22', true);
map2.set('33', false);
map2.set('44', true);
return map2;
}
let x = this.javed();
this.Dome(x);
function Dome(res){
res.forEach(x =>{
console.log('inside dome', x);
})
}
This shows the following error
Uncaught TypeError: res.forEach is not a function
at Dome (myfile.js:83:9)
Also I am not getting during the iteration how would I get the individual key and value if I want to manipulate or just console them?
3
Answers
Your problem is, that all
async
functions return aPromise
.So you’re not calling
forEach()
on aMap
as you would expect, but instead on aPromise
which does not have that function.Use
let x = await javed();
in order to resolve that promise and get back aMap
.Generally I would advise you to use the
this
keyword sparingly in JS, you don’t need it at all in your example and it can often be something other that what you expect. Also, try not to usevar
anymore.const
andlet
are much more isolated from external scripts and their scoping is easier to understand.Here’s a working example with the added
await
. If top-levelawait
is not supported, you can wrap the behavior in a newasync function
as I have done here:EDIT: Yes, if you need a promise to resolve, you need to
await
it, requiring anasync function
.The "old" way of using Promises (which
await
is actually just syntactic sugar for) does not require you to make the functionasync
, but executes non-linearly. Here’s an example:The returned value of an
async
function is a promise so you have to resolve it withawait
or.then()
:A third option would be using only
await
in a top-level of a module:You are trying a
forEach
over a promise.The method below is an async method, but it can return the value without
async/await
becausecreateMap
is not returning a promise.OR
You need to use
.then
to get the value asynchronous like belowTake a look on this explanation