NodeJS code is not waiting for function completion
I am creating an Excel file with a Lambda function that is later sent by E-Mail.
The Excel is filled with data before and is then stored like this(With the excel4node nom package):
console.log("Before print");
var test2 = await workbook.write(path, function(err, stats)
console.log("Excel written");
if (err)
console.error(err);
else
console.log(stats); // Prints out an instance of a node.js fs.Stats object
);
console.log("After print");
The code works sometimes. The problem is the following code is not waiting until the excel is written and the E-Mail cannot find the attachment.
How can I make my Lambda function wait until the excel is written to disk?
node.js asynchronous
add a comment |
I am creating an Excel file with a Lambda function that is later sent by E-Mail.
The Excel is filled with data before and is then stored like this(With the excel4node nom package):
console.log("Before print");
var test2 = await workbook.write(path, function(err, stats)
console.log("Excel written");
if (err)
console.error(err);
else
console.log(stats); // Prints out an instance of a node.js fs.Stats object
);
console.log("After print");
The code works sometimes. The problem is the following code is not waiting until the excel is written and the E-Mail cannot find the attachment.
How can I make my Lambda function wait until the excel is written to disk?
node.js asynchronous
You probably want to look at How do I convert an existing callback API to promises?
– Felix Kling
Nov 16 '18 at 1:11
add a comment |
I am creating an Excel file with a Lambda function that is later sent by E-Mail.
The Excel is filled with data before and is then stored like this(With the excel4node nom package):
console.log("Before print");
var test2 = await workbook.write(path, function(err, stats)
console.log("Excel written");
if (err)
console.error(err);
else
console.log(stats); // Prints out an instance of a node.js fs.Stats object
);
console.log("After print");
The code works sometimes. The problem is the following code is not waiting until the excel is written and the E-Mail cannot find the attachment.
How can I make my Lambda function wait until the excel is written to disk?
node.js asynchronous
I am creating an Excel file with a Lambda function that is later sent by E-Mail.
The Excel is filled with data before and is then stored like this(With the excel4node nom package):
console.log("Before print");
var test2 = await workbook.write(path, function(err, stats)
console.log("Excel written");
if (err)
console.error(err);
else
console.log(stats); // Prints out an instance of a node.js fs.Stats object
);
console.log("After print");
The code works sometimes. The problem is the following code is not waiting until the excel is written and the E-Mail cannot find the attachment.
How can I make my Lambda function wait until the excel is written to disk?
node.js asynchronous
node.js asynchronous
edited Nov 16 '18 at 1:30
jhpratt
3,184102433
3,184102433
asked Nov 16 '18 at 0:58
AlexAlex
5610
5610
You probably want to look at How do I convert an existing callback API to promises?
– Felix Kling
Nov 16 '18 at 1:11
add a comment |
You probably want to look at How do I convert an existing callback API to promises?
– Felix Kling
Nov 16 '18 at 1:11
You probably want to look at How do I convert an existing callback API to promises?
– Felix Kling
Nov 16 '18 at 1:11
You probably want to look at How do I convert an existing callback API to promises?
– Felix Kling
Nov 16 '18 at 1:11
add a comment |
2 Answers
2
active
oldest
votes
await only works with functions that return a promise that resolves when the underlying asynchronous operation is complete. Since you are passing a completion-style callback to the function, it likely does not return such a promise.
If the library you are using does not directly support promises, then you can promisify the function yourself.
const util = require('util');
workbook.writeP = util.promisify(workbook.write);
async function someFunc()
try
let result = await workbook.writeP(path);
console.log(result);
// do something here that runs after the .write operation is done
catch(e)
console.log(e);
add a comment |
I suggest putting the emailing code in the callback, in the else block.
The better option would be to actually use theasync/awaitkeywords that are part of the language.
– jhpratt
Nov 16 '18 at 1:25
I tried that, but then the Lambda function finishes before the E-Mail is sent
– Alex
Nov 16 '18 at 1:30
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%2f53329974%2fnodejs-code-is-not-waiting-for-function-completion%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
await only works with functions that return a promise that resolves when the underlying asynchronous operation is complete. Since you are passing a completion-style callback to the function, it likely does not return such a promise.
If the library you are using does not directly support promises, then you can promisify the function yourself.
const util = require('util');
workbook.writeP = util.promisify(workbook.write);
async function someFunc()
try
let result = await workbook.writeP(path);
console.log(result);
// do something here that runs after the .write operation is done
catch(e)
console.log(e);
add a comment |
await only works with functions that return a promise that resolves when the underlying asynchronous operation is complete. Since you are passing a completion-style callback to the function, it likely does not return such a promise.
If the library you are using does not directly support promises, then you can promisify the function yourself.
const util = require('util');
workbook.writeP = util.promisify(workbook.write);
async function someFunc()
try
let result = await workbook.writeP(path);
console.log(result);
// do something here that runs after the .write operation is done
catch(e)
console.log(e);
add a comment |
await only works with functions that return a promise that resolves when the underlying asynchronous operation is complete. Since you are passing a completion-style callback to the function, it likely does not return such a promise.
If the library you are using does not directly support promises, then you can promisify the function yourself.
const util = require('util');
workbook.writeP = util.promisify(workbook.write);
async function someFunc()
try
let result = await workbook.writeP(path);
console.log(result);
// do something here that runs after the .write operation is done
catch(e)
console.log(e);
await only works with functions that return a promise that resolves when the underlying asynchronous operation is complete. Since you are passing a completion-style callback to the function, it likely does not return such a promise.
If the library you are using does not directly support promises, then you can promisify the function yourself.
const util = require('util');
workbook.writeP = util.promisify(workbook.write);
async function someFunc()
try
let result = await workbook.writeP(path);
console.log(result);
// do something here that runs after the .write operation is done
catch(e)
console.log(e);
edited Nov 16 '18 at 1:12
answered Nov 16 '18 at 1:07
jfriend00jfriend00
439k55576621
439k55576621
add a comment |
add a comment |
I suggest putting the emailing code in the callback, in the else block.
The better option would be to actually use theasync/awaitkeywords that are part of the language.
– jhpratt
Nov 16 '18 at 1:25
I tried that, but then the Lambda function finishes before the E-Mail is sent
– Alex
Nov 16 '18 at 1:30
add a comment |
I suggest putting the emailing code in the callback, in the else block.
The better option would be to actually use theasync/awaitkeywords that are part of the language.
– jhpratt
Nov 16 '18 at 1:25
I tried that, but then the Lambda function finishes before the E-Mail is sent
– Alex
Nov 16 '18 at 1:30
add a comment |
I suggest putting the emailing code in the callback, in the else block.
I suggest putting the emailing code in the callback, in the else block.
answered Nov 16 '18 at 1:21
Sergio FloresSergio Flores
1126
1126
The better option would be to actually use theasync/awaitkeywords that are part of the language.
– jhpratt
Nov 16 '18 at 1:25
I tried that, but then the Lambda function finishes before the E-Mail is sent
– Alex
Nov 16 '18 at 1:30
add a comment |
The better option would be to actually use theasync/awaitkeywords that are part of the language.
– jhpratt
Nov 16 '18 at 1:25
I tried that, but then the Lambda function finishes before the E-Mail is sent
– Alex
Nov 16 '18 at 1:30
The better option would be to actually use the
async/await keywords that are part of the language.– jhpratt
Nov 16 '18 at 1:25
The better option would be to actually use the
async/await keywords that are part of the language.– jhpratt
Nov 16 '18 at 1:25
I tried that, but then the Lambda function finishes before the E-Mail is sent
– Alex
Nov 16 '18 at 1:30
I tried that, but then the Lambda function finishes before the E-Mail is sent
– Alex
Nov 16 '18 at 1:30
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%2f53329974%2fnodejs-code-is-not-waiting-for-function-completion%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
You probably want to look at How do I convert an existing callback API to promises?
– Felix Kling
Nov 16 '18 at 1:11