How to make sure all lines are executed before function return
up vote
0
down vote
favorite
Calling the readCSV from index.js
const productIds = await readCSV();
in another file:
async function readCSV() {
const filepath = path.resolve('src/input_csv.csv');
const readstream = await fs.createReadStream(filepath);
const stream = await readstream.pipe(parser());
let productIds = ;
await stream.on('data', data => {
productIds.push(data.SourceProductId);
console.log('SourceProductId', data.SourceProductId);
});
await stream.on('end', () => {
console.log(productIds);
});
if (productIds.length > 0) return productIds;
else return 'no products found';
});
}
it is giving the output:
in main:
SourceProductId 1000050429
SourceProductId 1132353
SourceProductId 999915195
SourceProductId 50162873
SourceProductId 1000661087
[ '1000050429', '1132353', '999915195', '50162873', '1000661087' ]
I'm expecting the function to return an array of all values read from CSV. but the seems like it is returning before executing the stream.on
statement. How to make sure all lines are executed before returning. I placed await before every statement but no luck
node.js asynchronous async-await
add a comment |
up vote
0
down vote
favorite
Calling the readCSV from index.js
const productIds = await readCSV();
in another file:
async function readCSV() {
const filepath = path.resolve('src/input_csv.csv');
const readstream = await fs.createReadStream(filepath);
const stream = await readstream.pipe(parser());
let productIds = ;
await stream.on('data', data => {
productIds.push(data.SourceProductId);
console.log('SourceProductId', data.SourceProductId);
});
await stream.on('end', () => {
console.log(productIds);
});
if (productIds.length > 0) return productIds;
else return 'no products found';
});
}
it is giving the output:
in main:
SourceProductId 1000050429
SourceProductId 1132353
SourceProductId 999915195
SourceProductId 50162873
SourceProductId 1000661087
[ '1000050429', '1132353', '999915195', '50162873', '1000661087' ]
I'm expecting the function to return an array of all values read from CSV. but the seems like it is returning before executing the stream.on
statement. How to make sure all lines are executed before returning. I placed await before every statement but no luck
node.js asynchronous async-await
1
async/await
only works with Promise-like objects. Streams are not like that. You need to learn about Promises before scatteringawait
keyword all over your code. For exampleawait fs.createReadStream(filepath)
what are you trying to "await" for here?
– Yury Tarabanko
Nov 20 at 12:59
how to make sure stream done before returning?
– m9m9m
Nov 20 at 13:01
I have added those as part of debugging now I have removed those.
– m9m9m
Nov 20 at 13:04
You need to create a Promise that will be resolved on stream end.
– Yury Tarabanko
Nov 20 at 13:04
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
Calling the readCSV from index.js
const productIds = await readCSV();
in another file:
async function readCSV() {
const filepath = path.resolve('src/input_csv.csv');
const readstream = await fs.createReadStream(filepath);
const stream = await readstream.pipe(parser());
let productIds = ;
await stream.on('data', data => {
productIds.push(data.SourceProductId);
console.log('SourceProductId', data.SourceProductId);
});
await stream.on('end', () => {
console.log(productIds);
});
if (productIds.length > 0) return productIds;
else return 'no products found';
});
}
it is giving the output:
in main:
SourceProductId 1000050429
SourceProductId 1132353
SourceProductId 999915195
SourceProductId 50162873
SourceProductId 1000661087
[ '1000050429', '1132353', '999915195', '50162873', '1000661087' ]
I'm expecting the function to return an array of all values read from CSV. but the seems like it is returning before executing the stream.on
statement. How to make sure all lines are executed before returning. I placed await before every statement but no luck
node.js asynchronous async-await
Calling the readCSV from index.js
const productIds = await readCSV();
in another file:
async function readCSV() {
const filepath = path.resolve('src/input_csv.csv');
const readstream = await fs.createReadStream(filepath);
const stream = await readstream.pipe(parser());
let productIds = ;
await stream.on('data', data => {
productIds.push(data.SourceProductId);
console.log('SourceProductId', data.SourceProductId);
});
await stream.on('end', () => {
console.log(productIds);
});
if (productIds.length > 0) return productIds;
else return 'no products found';
});
}
it is giving the output:
in main:
SourceProductId 1000050429
SourceProductId 1132353
SourceProductId 999915195
SourceProductId 50162873
SourceProductId 1000661087
[ '1000050429', '1132353', '999915195', '50162873', '1000661087' ]
I'm expecting the function to return an array of all values read from CSV. but the seems like it is returning before executing the stream.on
statement. How to make sure all lines are executed before returning. I placed await before every statement but no luck
node.js asynchronous async-await
node.js asynchronous async-await
asked Nov 20 at 12:53
m9m9m
437512
437512
1
async/await
only works with Promise-like objects. Streams are not like that. You need to learn about Promises before scatteringawait
keyword all over your code. For exampleawait fs.createReadStream(filepath)
what are you trying to "await" for here?
– Yury Tarabanko
Nov 20 at 12:59
how to make sure stream done before returning?
– m9m9m
Nov 20 at 13:01
I have added those as part of debugging now I have removed those.
– m9m9m
Nov 20 at 13:04
You need to create a Promise that will be resolved on stream end.
– Yury Tarabanko
Nov 20 at 13:04
add a comment |
1
async/await
only works with Promise-like objects. Streams are not like that. You need to learn about Promises before scatteringawait
keyword all over your code. For exampleawait fs.createReadStream(filepath)
what are you trying to "await" for here?
– Yury Tarabanko
Nov 20 at 12:59
how to make sure stream done before returning?
– m9m9m
Nov 20 at 13:01
I have added those as part of debugging now I have removed those.
– m9m9m
Nov 20 at 13:04
You need to create a Promise that will be resolved on stream end.
– Yury Tarabanko
Nov 20 at 13:04
1
1
async/await
only works with Promise-like objects. Streams are not like that. You need to learn about Promises before scattering await
keyword all over your code. For example await fs.createReadStream(filepath)
what are you trying to "await" for here?– Yury Tarabanko
Nov 20 at 12:59
async/await
only works with Promise-like objects. Streams are not like that. You need to learn about Promises before scattering await
keyword all over your code. For example await fs.createReadStream(filepath)
what are you trying to "await" for here?– Yury Tarabanko
Nov 20 at 12:59
how to make sure stream done before returning?
– m9m9m
Nov 20 at 13:01
how to make sure stream done before returning?
– m9m9m
Nov 20 at 13:01
I have added those as part of debugging now I have removed those.
– m9m9m
Nov 20 at 13:04
I have added those as part of debugging now I have removed those.
– m9m9m
Nov 20 at 13:04
You need to create a Promise that will be resolved on stream end.
– Yury Tarabanko
Nov 20 at 13:04
You need to create a Promise that will be resolved on stream end.
– Yury Tarabanko
Nov 20 at 13:04
add a comment |
1 Answer
1
active
oldest
votes
up vote
2
down vote
accepted
stream.on
doesn't return a promise, so you cannot await
it.
You can work around this by returning a promise from your readCSV
function:
function readCSV() {
return new Promise(resolve => {
const filepath = path.resolve('src/input_csv.csv');
const readstream = fs.createReadStream(filepath);
const stream = readstream.pipe(parser());
let productIds = ;
stream.on('data', data => {
productIds.push(data.SourceProductId);
console.log('SourceProductId', data.SourceProductId);
});
stream.on('end', () => {
console.log(productIds);
if (productIds.length > 0) resolve(productIds);
else resolve('no products found');
});
});
}
You create a promise by passing a callback function as argument. That callback function gets an argument resolve
, which is a another callback function that you call when your asynchronous operation is done, passing the result.
In the example above, we call this resolve
callback with the product IDs after the file read stream has finished.
Since readCSV
now returns a promise, you can await
it like you did in your code example:
const productIds = await readCSV();
Sorry misread your answer.
– Yury Tarabanko
Nov 20 at 13:03
It worked!! please explain.
– m9m9m
Nov 22 at 9:50
I've added some explanation to make it clear what's going on
– Patrick Hund
Nov 22 at 10: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',
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%2f53393442%2fhow-to-make-sure-all-lines-are-executed-before-function-return%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
accepted
stream.on
doesn't return a promise, so you cannot await
it.
You can work around this by returning a promise from your readCSV
function:
function readCSV() {
return new Promise(resolve => {
const filepath = path.resolve('src/input_csv.csv');
const readstream = fs.createReadStream(filepath);
const stream = readstream.pipe(parser());
let productIds = ;
stream.on('data', data => {
productIds.push(data.SourceProductId);
console.log('SourceProductId', data.SourceProductId);
});
stream.on('end', () => {
console.log(productIds);
if (productIds.length > 0) resolve(productIds);
else resolve('no products found');
});
});
}
You create a promise by passing a callback function as argument. That callback function gets an argument resolve
, which is a another callback function that you call when your asynchronous operation is done, passing the result.
In the example above, we call this resolve
callback with the product IDs after the file read stream has finished.
Since readCSV
now returns a promise, you can await
it like you did in your code example:
const productIds = await readCSV();
Sorry misread your answer.
– Yury Tarabanko
Nov 20 at 13:03
It worked!! please explain.
– m9m9m
Nov 22 at 9:50
I've added some explanation to make it clear what's going on
– Patrick Hund
Nov 22 at 10:29
add a comment |
up vote
2
down vote
accepted
stream.on
doesn't return a promise, so you cannot await
it.
You can work around this by returning a promise from your readCSV
function:
function readCSV() {
return new Promise(resolve => {
const filepath = path.resolve('src/input_csv.csv');
const readstream = fs.createReadStream(filepath);
const stream = readstream.pipe(parser());
let productIds = ;
stream.on('data', data => {
productIds.push(data.SourceProductId);
console.log('SourceProductId', data.SourceProductId);
});
stream.on('end', () => {
console.log(productIds);
if (productIds.length > 0) resolve(productIds);
else resolve('no products found');
});
});
}
You create a promise by passing a callback function as argument. That callback function gets an argument resolve
, which is a another callback function that you call when your asynchronous operation is done, passing the result.
In the example above, we call this resolve
callback with the product IDs after the file read stream has finished.
Since readCSV
now returns a promise, you can await
it like you did in your code example:
const productIds = await readCSV();
Sorry misread your answer.
– Yury Tarabanko
Nov 20 at 13:03
It worked!! please explain.
– m9m9m
Nov 22 at 9:50
I've added some explanation to make it clear what's going on
– Patrick Hund
Nov 22 at 10:29
add a comment |
up vote
2
down vote
accepted
up vote
2
down vote
accepted
stream.on
doesn't return a promise, so you cannot await
it.
You can work around this by returning a promise from your readCSV
function:
function readCSV() {
return new Promise(resolve => {
const filepath = path.resolve('src/input_csv.csv');
const readstream = fs.createReadStream(filepath);
const stream = readstream.pipe(parser());
let productIds = ;
stream.on('data', data => {
productIds.push(data.SourceProductId);
console.log('SourceProductId', data.SourceProductId);
});
stream.on('end', () => {
console.log(productIds);
if (productIds.length > 0) resolve(productIds);
else resolve('no products found');
});
});
}
You create a promise by passing a callback function as argument. That callback function gets an argument resolve
, which is a another callback function that you call when your asynchronous operation is done, passing the result.
In the example above, we call this resolve
callback with the product IDs after the file read stream has finished.
Since readCSV
now returns a promise, you can await
it like you did in your code example:
const productIds = await readCSV();
stream.on
doesn't return a promise, so you cannot await
it.
You can work around this by returning a promise from your readCSV
function:
function readCSV() {
return new Promise(resolve => {
const filepath = path.resolve('src/input_csv.csv');
const readstream = fs.createReadStream(filepath);
const stream = readstream.pipe(parser());
let productIds = ;
stream.on('data', data => {
productIds.push(data.SourceProductId);
console.log('SourceProductId', data.SourceProductId);
});
stream.on('end', () => {
console.log(productIds);
if (productIds.length > 0) resolve(productIds);
else resolve('no products found');
});
});
}
You create a promise by passing a callback function as argument. That callback function gets an argument resolve
, which is a another callback function that you call when your asynchronous operation is done, passing the result.
In the example above, we call this resolve
callback with the product IDs after the file read stream has finished.
Since readCSV
now returns a promise, you can await
it like you did in your code example:
const productIds = await readCSV();
edited Nov 22 at 10:28
answered Nov 20 at 13:01
Patrick Hund
6,79252147
6,79252147
Sorry misread your answer.
– Yury Tarabanko
Nov 20 at 13:03
It worked!! please explain.
– m9m9m
Nov 22 at 9:50
I've added some explanation to make it clear what's going on
– Patrick Hund
Nov 22 at 10:29
add a comment |
Sorry misread your answer.
– Yury Tarabanko
Nov 20 at 13:03
It worked!! please explain.
– m9m9m
Nov 22 at 9:50
I've added some explanation to make it clear what's going on
– Patrick Hund
Nov 22 at 10:29
Sorry misread your answer.
– Yury Tarabanko
Nov 20 at 13:03
Sorry misread your answer.
– Yury Tarabanko
Nov 20 at 13:03
It worked!! please explain.
– m9m9m
Nov 22 at 9:50
It worked!! please explain.
– m9m9m
Nov 22 at 9:50
I've added some explanation to make it clear what's going on
– Patrick Hund
Nov 22 at 10:29
I've added some explanation to make it clear what's going on
– Patrick Hund
Nov 22 at 10: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.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- 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%2f53393442%2fhow-to-make-sure-all-lines-are-executed-before-function-return%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
1
async/await
only works with Promise-like objects. Streams are not like that. You need to learn about Promises before scatteringawait
keyword all over your code. For exampleawait fs.createReadStream(filepath)
what are you trying to "await" for here?– Yury Tarabanko
Nov 20 at 12:59
how to make sure stream done before returning?
– m9m9m
Nov 20 at 13:01
I have added those as part of debugging now I have removed those.
– m9m9m
Nov 20 at 13:04
You need to create a Promise that will be resolved on stream end.
– Yury Tarabanko
Nov 20 at 13:04