NodeJS code is not waiting for function completion










0















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?










share|improve this question
























  • You probably want to look at How do I convert an existing callback API to promises?

    – Felix Kling
    Nov 16 '18 at 1:11















0















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?










share|improve this question
























  • You probably want to look at How do I convert an existing callback API to promises?

    – Felix Kling
    Nov 16 '18 at 1:11













0












0








0








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?










share|improve this question
















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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








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

















  • 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












2 Answers
2






active

oldest

votes


















3














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);







share|improve this answer
































    0














    I suggest putting the emailing code in the callback, in the else block.






    share|improve this answer























    • 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










    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
    );



    );













    draft saved

    draft discarded


















    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









    3














    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);







    share|improve this answer





























      3














      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);







      share|improve this answer



























        3












        3








        3







        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);







        share|improve this answer















        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);








        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 16 '18 at 1:12

























        answered Nov 16 '18 at 1:07









        jfriend00jfriend00

        439k55576621




        439k55576621























            0














            I suggest putting the emailing code in the callback, in the else block.






            share|improve this answer























            • 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















            0














            I suggest putting the emailing code in the callback, in the else block.






            share|improve this answer























            • 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













            0












            0








            0







            I suggest putting the emailing code in the callback, in the else block.






            share|improve this answer













            I suggest putting the emailing code in the callback, in the else block.







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Nov 16 '18 at 1:21









            Sergio FloresSergio Flores

            1126




            1126












            • 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

















            • 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
















            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

















            draft saved

            draft discarded
















































            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.




            draft saved


            draft discarded














            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





















































            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







            Popular posts from this blog

            27

            Top Tejano songwriter Luis Silva dead of heart attack at 64

            Category:Rhetoric