How to use callback or Async in for loop?
I search and read about Asynchronous functions and callbacks. But i was not able to solve my problem for a week. I want to do 'fs readfile' inside loop with order. I try the following but i am not successful.
// on the code below, console.log print the value in random order and 'storedata' is empity.
// my goal is to do readfile in loop orderly and store the value
router.get("/files/readfiles", function(req,res){
var storedata= ;
var filenames= ["file1","file2","file3","file4"];
for (var i=0; i< filenames.length; i++){
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) throw err;
storedata.push(data);
console.log(data);
});
console.log(storedata); // this returns empty array
});
I also try in another way:
router.get("/files/readfiles", function(req,res){
var filenames= ["file1","file2","file3","file4"];
filenames.forEach(readfiles);
function readfiles(value) {
var dataread = fs.readFile('views/allfiles/'+ value +'.ejs','utf8')
console.log (dataread);
}
});
on the above try i get an error of: TypeError [ERR_INVALID_CALLBACK]: Callback must be a function.
I am new to Asynchronous methods any help please.
javascript node.js asynchronous
|
show 1 more comment
I search and read about Asynchronous functions and callbacks. But i was not able to solve my problem for a week. I want to do 'fs readfile' inside loop with order. I try the following but i am not successful.
// on the code below, console.log print the value in random order and 'storedata' is empity.
// my goal is to do readfile in loop orderly and store the value
router.get("/files/readfiles", function(req,res){
var storedata= ;
var filenames= ["file1","file2","file3","file4"];
for (var i=0; i< filenames.length; i++){
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) throw err;
storedata.push(data);
console.log(data);
});
console.log(storedata); // this returns empty array
});
I also try in another way:
router.get("/files/readfiles", function(req,res){
var filenames= ["file1","file2","file3","file4"];
filenames.forEach(readfiles);
function readfiles(value) {
var dataread = fs.readFile('views/allfiles/'+ value +'.ejs','utf8')
console.log (dataread);
}
});
on the above try i get an error of: TypeError [ERR_INVALID_CALLBACK]: Callback must be a function.
I am new to Asynchronous methods any help please.
javascript node.js asynchronous
Possible duplicate of How do I return the response from an asynchronous call?
– Jared Smith
Nov 20 '18 at 16:39
2
You will have to either use the sync version orPromise.all
. Either way you will need to understand what asynchronous means, of courseconsole.log(storedata)
logs an empty array as the IO hasn't completed yet when it runs. If you use a callback you only have access to the data in a callback.
– Jared Smith
Nov 20 '18 at 16:39
What exactly is the result you want? Blast through it as fast as possible, or read one file at a time.
– Kevin B
Nov 20 '18 at 16:42
@Kevin i want to do fs read file inside loop (read multiple file orderly) then store the value to use it . this is what i want as i wrote in the question.
– wzwd
Nov 20 '18 at 16:45
@wzwd Yes, i understand that, but due to the asynchronous nature of reading files, you have two different ways of doing it. You haven't specified which one would be preferred.
– Kevin B
Nov 20 '18 at 16:49
|
show 1 more comment
I search and read about Asynchronous functions and callbacks. But i was not able to solve my problem for a week. I want to do 'fs readfile' inside loop with order. I try the following but i am not successful.
// on the code below, console.log print the value in random order and 'storedata' is empity.
// my goal is to do readfile in loop orderly and store the value
router.get("/files/readfiles", function(req,res){
var storedata= ;
var filenames= ["file1","file2","file3","file4"];
for (var i=0; i< filenames.length; i++){
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) throw err;
storedata.push(data);
console.log(data);
});
console.log(storedata); // this returns empty array
});
I also try in another way:
router.get("/files/readfiles", function(req,res){
var filenames= ["file1","file2","file3","file4"];
filenames.forEach(readfiles);
function readfiles(value) {
var dataread = fs.readFile('views/allfiles/'+ value +'.ejs','utf8')
console.log (dataread);
}
});
on the above try i get an error of: TypeError [ERR_INVALID_CALLBACK]: Callback must be a function.
I am new to Asynchronous methods any help please.
javascript node.js asynchronous
I search and read about Asynchronous functions and callbacks. But i was not able to solve my problem for a week. I want to do 'fs readfile' inside loop with order. I try the following but i am not successful.
// on the code below, console.log print the value in random order and 'storedata' is empity.
// my goal is to do readfile in loop orderly and store the value
router.get("/files/readfiles", function(req,res){
var storedata= ;
var filenames= ["file1","file2","file3","file4"];
for (var i=0; i< filenames.length; i++){
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) throw err;
storedata.push(data);
console.log(data);
});
console.log(storedata); // this returns empty array
});
I also try in another way:
router.get("/files/readfiles", function(req,res){
var filenames= ["file1","file2","file3","file4"];
filenames.forEach(readfiles);
function readfiles(value) {
var dataread = fs.readFile('views/allfiles/'+ value +'.ejs','utf8')
console.log (dataread);
}
});
on the above try i get an error of: TypeError [ERR_INVALID_CALLBACK]: Callback must be a function.
I am new to Asynchronous methods any help please.
javascript node.js asynchronous
javascript node.js asynchronous
edited Nov 20 '18 at 17:40
iagowp
1,40511224
1,40511224
asked Nov 20 '18 at 16:37
wzwdwzwd
296
296
Possible duplicate of How do I return the response from an asynchronous call?
– Jared Smith
Nov 20 '18 at 16:39
2
You will have to either use the sync version orPromise.all
. Either way you will need to understand what asynchronous means, of courseconsole.log(storedata)
logs an empty array as the IO hasn't completed yet when it runs. If you use a callback you only have access to the data in a callback.
– Jared Smith
Nov 20 '18 at 16:39
What exactly is the result you want? Blast through it as fast as possible, or read one file at a time.
– Kevin B
Nov 20 '18 at 16:42
@Kevin i want to do fs read file inside loop (read multiple file orderly) then store the value to use it . this is what i want as i wrote in the question.
– wzwd
Nov 20 '18 at 16:45
@wzwd Yes, i understand that, but due to the asynchronous nature of reading files, you have two different ways of doing it. You haven't specified which one would be preferred.
– Kevin B
Nov 20 '18 at 16:49
|
show 1 more comment
Possible duplicate of How do I return the response from an asynchronous call?
– Jared Smith
Nov 20 '18 at 16:39
2
You will have to either use the sync version orPromise.all
. Either way you will need to understand what asynchronous means, of courseconsole.log(storedata)
logs an empty array as the IO hasn't completed yet when it runs. If you use a callback you only have access to the data in a callback.
– Jared Smith
Nov 20 '18 at 16:39
What exactly is the result you want? Blast through it as fast as possible, or read one file at a time.
– Kevin B
Nov 20 '18 at 16:42
@Kevin i want to do fs read file inside loop (read multiple file orderly) then store the value to use it . this is what i want as i wrote in the question.
– wzwd
Nov 20 '18 at 16:45
@wzwd Yes, i understand that, but due to the asynchronous nature of reading files, you have two different ways of doing it. You haven't specified which one would be preferred.
– Kevin B
Nov 20 '18 at 16:49
Possible duplicate of How do I return the response from an asynchronous call?
– Jared Smith
Nov 20 '18 at 16:39
Possible duplicate of How do I return the response from an asynchronous call?
– Jared Smith
Nov 20 '18 at 16:39
2
2
You will have to either use the sync version or
Promise.all
. Either way you will need to understand what asynchronous means, of course console.log(storedata)
logs an empty array as the IO hasn't completed yet when it runs. If you use a callback you only have access to the data in a callback.– Jared Smith
Nov 20 '18 at 16:39
You will have to either use the sync version or
Promise.all
. Either way you will need to understand what asynchronous means, of course console.log(storedata)
logs an empty array as the IO hasn't completed yet when it runs. If you use a callback you only have access to the data in a callback.– Jared Smith
Nov 20 '18 at 16:39
What exactly is the result you want? Blast through it as fast as possible, or read one file at a time.
– Kevin B
Nov 20 '18 at 16:42
What exactly is the result you want? Blast through it as fast as possible, or read one file at a time.
– Kevin B
Nov 20 '18 at 16:42
@Kevin i want to do fs read file inside loop (read multiple file orderly) then store the value to use it . this is what i want as i wrote in the question.
– wzwd
Nov 20 '18 at 16:45
@Kevin i want to do fs read file inside loop (read multiple file orderly) then store the value to use it . this is what i want as i wrote in the question.
– wzwd
Nov 20 '18 at 16:45
@wzwd Yes, i understand that, but due to the asynchronous nature of reading files, you have two different ways of doing it. You haven't specified which one would be preferred.
– Kevin B
Nov 20 '18 at 16:49
@wzwd Yes, i understand that, but due to the asynchronous nature of reading files, you have two different ways of doing it. You haven't specified which one would be preferred.
– Kevin B
Nov 20 '18 at 16:49
|
show 1 more comment
3 Answers
3
active
oldest
votes
If you're using Node v10 or above you can use the fs promises API and async/await.
To read the files in series:
router.get( "/files/readfiles", async function( req, res ) {
const storedata = [ ];
const filenames = [ "file1", "file2" , "file3", "file4" ];
for (let i = 0; i < filenames.length; i++ ) {
const data = await fs.promises.readFile( 'views/allfiles/'+ filenames[i] +'.ejs', { encoding: 'utf8' } );
storedata.push( data );
}
console.log( storedata );
} );
or to read them in parallel:
router.get( "/files/readfiles", async function( req, res ) {
const promises = [ ];
const filenames = [ "file1", "file2", "file3", "file4" ];
for (let i = 0; i < filenames.length; i++ ) {
const promise = fs.promises.readFile( 'views/allfiles/'+ filenames[i] +'.ejs', { encoding: 'utf8' } );
promises.push( promise );
}
const storedata = await Promise.all( promises );
console.log( storedata );
} );
On the 1st method i get: 'parsing error: Unexpected token fs'. I can't modify this line. On the second method i get a result of:` [ Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> },]` (node:3575) ExperimentalWarning: The fs.promises API is experimental
– wzwd
Nov 20 '18 at 17:21
@wzwd Sounds like you didn't put theasync
keyword in front offunction
.
– Paulpro
Nov 20 '18 at 19:24
The ExperimentalWarning should be there, but it's just printed to stderr and shouldn't affect your program.
– Paulpro
Nov 20 '18 at 19:28
Yes i forgot to add Async on the function. It perfectly works. Thanks
– wzwd
Nov 21 '18 at 10:52
add a comment |
You should use ES2017 async/await
syntax like this.
router.get("/files/readfiles", async function(req, res){
var storedata= ;
var filenames= ["file1","file2","file3","file4"];
for (var i=0; i< filenames.length; i++){
await new Promise((resolve, reject) => {
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) return reject( err )
storedata.push(data);
resolve();
});
})
console.log(storedata);
}
});
add a comment |
Your second code doesnt provide a callback function, thats your error.
Your first code, you are trying to work with callbacks, so you'll need to follow your code nested into the callback, thats what is called callback hell
It would look like this:
router.get("/files/readfiles", function(req,res){
var storedata= ;
var filenames= ["file1","file2","file3","file4"];
for (let i = 0; i< filenames.length; i++){
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) throw err;
storedata[i] = data;
if (storedata.length === filenames.length) {
console.log(storedata);
// do stuff you want, like:
res.send(storedata)
}
});
});
If you plan on using node 10, I recommend you look at the other answer with Promise.all. Async/await is great
Thanks it is working, I need to read more about callback , Async/await, promise. I am using Node v10.6.0 but i have no idea this time how to use Promise and Async. may be if you have some links to study i will follow it
– wzwd
Nov 20 '18 at 17:29
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53397538%2fhow-to-use-callback-or-async-in-for-loop%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
If you're using Node v10 or above you can use the fs promises API and async/await.
To read the files in series:
router.get( "/files/readfiles", async function( req, res ) {
const storedata = [ ];
const filenames = [ "file1", "file2" , "file3", "file4" ];
for (let i = 0; i < filenames.length; i++ ) {
const data = await fs.promises.readFile( 'views/allfiles/'+ filenames[i] +'.ejs', { encoding: 'utf8' } );
storedata.push( data );
}
console.log( storedata );
} );
or to read them in parallel:
router.get( "/files/readfiles", async function( req, res ) {
const promises = [ ];
const filenames = [ "file1", "file2", "file3", "file4" ];
for (let i = 0; i < filenames.length; i++ ) {
const promise = fs.promises.readFile( 'views/allfiles/'+ filenames[i] +'.ejs', { encoding: 'utf8' } );
promises.push( promise );
}
const storedata = await Promise.all( promises );
console.log( storedata );
} );
On the 1st method i get: 'parsing error: Unexpected token fs'. I can't modify this line. On the second method i get a result of:` [ Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> },]` (node:3575) ExperimentalWarning: The fs.promises API is experimental
– wzwd
Nov 20 '18 at 17:21
@wzwd Sounds like you didn't put theasync
keyword in front offunction
.
– Paulpro
Nov 20 '18 at 19:24
The ExperimentalWarning should be there, but it's just printed to stderr and shouldn't affect your program.
– Paulpro
Nov 20 '18 at 19:28
Yes i forgot to add Async on the function. It perfectly works. Thanks
– wzwd
Nov 21 '18 at 10:52
add a comment |
If you're using Node v10 or above you can use the fs promises API and async/await.
To read the files in series:
router.get( "/files/readfiles", async function( req, res ) {
const storedata = [ ];
const filenames = [ "file1", "file2" , "file3", "file4" ];
for (let i = 0; i < filenames.length; i++ ) {
const data = await fs.promises.readFile( 'views/allfiles/'+ filenames[i] +'.ejs', { encoding: 'utf8' } );
storedata.push( data );
}
console.log( storedata );
} );
or to read them in parallel:
router.get( "/files/readfiles", async function( req, res ) {
const promises = [ ];
const filenames = [ "file1", "file2", "file3", "file4" ];
for (let i = 0; i < filenames.length; i++ ) {
const promise = fs.promises.readFile( 'views/allfiles/'+ filenames[i] +'.ejs', { encoding: 'utf8' } );
promises.push( promise );
}
const storedata = await Promise.all( promises );
console.log( storedata );
} );
On the 1st method i get: 'parsing error: Unexpected token fs'. I can't modify this line. On the second method i get a result of:` [ Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> },]` (node:3575) ExperimentalWarning: The fs.promises API is experimental
– wzwd
Nov 20 '18 at 17:21
@wzwd Sounds like you didn't put theasync
keyword in front offunction
.
– Paulpro
Nov 20 '18 at 19:24
The ExperimentalWarning should be there, but it's just printed to stderr and shouldn't affect your program.
– Paulpro
Nov 20 '18 at 19:28
Yes i forgot to add Async on the function. It perfectly works. Thanks
– wzwd
Nov 21 '18 at 10:52
add a comment |
If you're using Node v10 or above you can use the fs promises API and async/await.
To read the files in series:
router.get( "/files/readfiles", async function( req, res ) {
const storedata = [ ];
const filenames = [ "file1", "file2" , "file3", "file4" ];
for (let i = 0; i < filenames.length; i++ ) {
const data = await fs.promises.readFile( 'views/allfiles/'+ filenames[i] +'.ejs', { encoding: 'utf8' } );
storedata.push( data );
}
console.log( storedata );
} );
or to read them in parallel:
router.get( "/files/readfiles", async function( req, res ) {
const promises = [ ];
const filenames = [ "file1", "file2", "file3", "file4" ];
for (let i = 0; i < filenames.length; i++ ) {
const promise = fs.promises.readFile( 'views/allfiles/'+ filenames[i] +'.ejs', { encoding: 'utf8' } );
promises.push( promise );
}
const storedata = await Promise.all( promises );
console.log( storedata );
} );
If you're using Node v10 or above you can use the fs promises API and async/await.
To read the files in series:
router.get( "/files/readfiles", async function( req, res ) {
const storedata = [ ];
const filenames = [ "file1", "file2" , "file3", "file4" ];
for (let i = 0; i < filenames.length; i++ ) {
const data = await fs.promises.readFile( 'views/allfiles/'+ filenames[i] +'.ejs', { encoding: 'utf8' } );
storedata.push( data );
}
console.log( storedata );
} );
or to read them in parallel:
router.get( "/files/readfiles", async function( req, res ) {
const promises = [ ];
const filenames = [ "file1", "file2", "file3", "file4" ];
for (let i = 0; i < filenames.length; i++ ) {
const promise = fs.promises.readFile( 'views/allfiles/'+ filenames[i] +'.ejs', { encoding: 'utf8' } );
promises.push( promise );
}
const storedata = await Promise.all( promises );
console.log( storedata );
} );
answered Nov 20 '18 at 16:44
PaulproPaulpro
114k15225231
114k15225231
On the 1st method i get: 'parsing error: Unexpected token fs'. I can't modify this line. On the second method i get a result of:` [ Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> },]` (node:3575) ExperimentalWarning: The fs.promises API is experimental
– wzwd
Nov 20 '18 at 17:21
@wzwd Sounds like you didn't put theasync
keyword in front offunction
.
– Paulpro
Nov 20 '18 at 19:24
The ExperimentalWarning should be there, but it's just printed to stderr and shouldn't affect your program.
– Paulpro
Nov 20 '18 at 19:28
Yes i forgot to add Async on the function. It perfectly works. Thanks
– wzwd
Nov 21 '18 at 10:52
add a comment |
On the 1st method i get: 'parsing error: Unexpected token fs'. I can't modify this line. On the second method i get a result of:` [ Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> },]` (node:3575) ExperimentalWarning: The fs.promises API is experimental
– wzwd
Nov 20 '18 at 17:21
@wzwd Sounds like you didn't put theasync
keyword in front offunction
.
– Paulpro
Nov 20 '18 at 19:24
The ExperimentalWarning should be there, but it's just printed to stderr and shouldn't affect your program.
– Paulpro
Nov 20 '18 at 19:28
Yes i forgot to add Async on the function. It perfectly works. Thanks
– wzwd
Nov 21 '18 at 10:52
On the 1st method i get: 'parsing error: Unexpected token fs'. I can't modify this line. On the second method i get a result of:` [ Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> },]` (node:3575) ExperimentalWarning: The fs.promises API is experimental
– wzwd
Nov 20 '18 at 17:21
On the 1st method i get: 'parsing error: Unexpected token fs'. I can't modify this line. On the second method i get a result of:` [ Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> },]` (node:3575) ExperimentalWarning: The fs.promises API is experimental
– wzwd
Nov 20 '18 at 17:21
@wzwd Sounds like you didn't put the
async
keyword in front of function
.– Paulpro
Nov 20 '18 at 19:24
@wzwd Sounds like you didn't put the
async
keyword in front of function
.– Paulpro
Nov 20 '18 at 19:24
The ExperimentalWarning should be there, but it's just printed to stderr and shouldn't affect your program.
– Paulpro
Nov 20 '18 at 19:28
The ExperimentalWarning should be there, but it's just printed to stderr and shouldn't affect your program.
– Paulpro
Nov 20 '18 at 19:28
Yes i forgot to add Async on the function. It perfectly works. Thanks
– wzwd
Nov 21 '18 at 10:52
Yes i forgot to add Async on the function. It perfectly works. Thanks
– wzwd
Nov 21 '18 at 10:52
add a comment |
You should use ES2017 async/await
syntax like this.
router.get("/files/readfiles", async function(req, res){
var storedata= ;
var filenames= ["file1","file2","file3","file4"];
for (var i=0; i< filenames.length; i++){
await new Promise((resolve, reject) => {
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) return reject( err )
storedata.push(data);
resolve();
});
})
console.log(storedata);
}
});
add a comment |
You should use ES2017 async/await
syntax like this.
router.get("/files/readfiles", async function(req, res){
var storedata= ;
var filenames= ["file1","file2","file3","file4"];
for (var i=0; i< filenames.length; i++){
await new Promise((resolve, reject) => {
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) return reject( err )
storedata.push(data);
resolve();
});
})
console.log(storedata);
}
});
add a comment |
You should use ES2017 async/await
syntax like this.
router.get("/files/readfiles", async function(req, res){
var storedata= ;
var filenames= ["file1","file2","file3","file4"];
for (var i=0; i< filenames.length; i++){
await new Promise((resolve, reject) => {
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) return reject( err )
storedata.push(data);
resolve();
});
})
console.log(storedata);
}
});
You should use ES2017 async/await
syntax like this.
router.get("/files/readfiles", async function(req, res){
var storedata= ;
var filenames= ["file1","file2","file3","file4"];
for (var i=0; i< filenames.length; i++){
await new Promise((resolve, reject) => {
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) return reject( err )
storedata.push(data);
resolve();
});
})
console.log(storedata);
}
});
answered Dec 6 '18 at 19:24
Fernando CarvajalFernando Carvajal
627713
627713
add a comment |
add a comment |
Your second code doesnt provide a callback function, thats your error.
Your first code, you are trying to work with callbacks, so you'll need to follow your code nested into the callback, thats what is called callback hell
It would look like this:
router.get("/files/readfiles", function(req,res){
var storedata= ;
var filenames= ["file1","file2","file3","file4"];
for (let i = 0; i< filenames.length; i++){
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) throw err;
storedata[i] = data;
if (storedata.length === filenames.length) {
console.log(storedata);
// do stuff you want, like:
res.send(storedata)
}
});
});
If you plan on using node 10, I recommend you look at the other answer with Promise.all. Async/await is great
Thanks it is working, I need to read more about callback , Async/await, promise. I am using Node v10.6.0 but i have no idea this time how to use Promise and Async. may be if you have some links to study i will follow it
– wzwd
Nov 20 '18 at 17:29
add a comment |
Your second code doesnt provide a callback function, thats your error.
Your first code, you are trying to work with callbacks, so you'll need to follow your code nested into the callback, thats what is called callback hell
It would look like this:
router.get("/files/readfiles", function(req,res){
var storedata= ;
var filenames= ["file1","file2","file3","file4"];
for (let i = 0; i< filenames.length; i++){
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) throw err;
storedata[i] = data;
if (storedata.length === filenames.length) {
console.log(storedata);
// do stuff you want, like:
res.send(storedata)
}
});
});
If you plan on using node 10, I recommend you look at the other answer with Promise.all. Async/await is great
Thanks it is working, I need to read more about callback , Async/await, promise. I am using Node v10.6.0 but i have no idea this time how to use Promise and Async. may be if you have some links to study i will follow it
– wzwd
Nov 20 '18 at 17:29
add a comment |
Your second code doesnt provide a callback function, thats your error.
Your first code, you are trying to work with callbacks, so you'll need to follow your code nested into the callback, thats what is called callback hell
It would look like this:
router.get("/files/readfiles", function(req,res){
var storedata= ;
var filenames= ["file1","file2","file3","file4"];
for (let i = 0; i< filenames.length; i++){
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) throw err;
storedata[i] = data;
if (storedata.length === filenames.length) {
console.log(storedata);
// do stuff you want, like:
res.send(storedata)
}
});
});
If you plan on using node 10, I recommend you look at the other answer with Promise.all. Async/await is great
Your second code doesnt provide a callback function, thats your error.
Your first code, you are trying to work with callbacks, so you'll need to follow your code nested into the callback, thats what is called callback hell
It would look like this:
router.get("/files/readfiles", function(req,res){
var storedata= ;
var filenames= ["file1","file2","file3","file4"];
for (let i = 0; i< filenames.length; i++){
fs.readFile('views/allfiles/'+ filenames[i] +'.ejs','utf8',function (err, data) {
if (err) throw err;
storedata[i] = data;
if (storedata.length === filenames.length) {
console.log(storedata);
// do stuff you want, like:
res.send(storedata)
}
});
});
If you plan on using node 10, I recommend you look at the other answer with Promise.all. Async/await is great
edited Nov 20 '18 at 17:27
answered Nov 20 '18 at 16:56
iagowpiagowp
1,40511224
1,40511224
Thanks it is working, I need to read more about callback , Async/await, promise. I am using Node v10.6.0 but i have no idea this time how to use Promise and Async. may be if you have some links to study i will follow it
– wzwd
Nov 20 '18 at 17:29
add a comment |
Thanks it is working, I need to read more about callback , Async/await, promise. I am using Node v10.6.0 but i have no idea this time how to use Promise and Async. may be if you have some links to study i will follow it
– wzwd
Nov 20 '18 at 17:29
Thanks it is working, I need to read more about callback , Async/await, promise. I am using Node v10.6.0 but i have no idea this time how to use Promise and Async. may be if you have some links to study i will follow it
– wzwd
Nov 20 '18 at 17:29
Thanks it is working, I need to read more about callback , Async/await, promise. I am using Node v10.6.0 but i have no idea this time how to use Promise and Async. may be if you have some links to study i will follow it
– wzwd
Nov 20 '18 at 17:29
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53397538%2fhow-to-use-callback-or-async-in-for-loop%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Possible duplicate of How do I return the response from an asynchronous call?
– Jared Smith
Nov 20 '18 at 16:39
2
You will have to either use the sync version or
Promise.all
. Either way you will need to understand what asynchronous means, of courseconsole.log(storedata)
logs an empty array as the IO hasn't completed yet when it runs. If you use a callback you only have access to the data in a callback.– Jared Smith
Nov 20 '18 at 16:39
What exactly is the result you want? Blast through it as fast as possible, or read one file at a time.
– Kevin B
Nov 20 '18 at 16:42
@Kevin i want to do fs read file inside loop (read multiple file orderly) then store the value to use it . this is what i want as i wrote in the question.
– wzwd
Nov 20 '18 at 16:45
@wzwd Yes, i understand that, but due to the asynchronous nature of reading files, you have two different ways of doing it. You haven't specified which one would be preferred.
– Kevin B
Nov 20 '18 at 16:49