0

I'm using a node script to make several api calls asynchronously and now i need to 'do something' once those calls are done. Not sure what to do in my createProject() function after i perform the request, set the options and get doSomething AFTER the options are set.

function performRequest(reqOptions, reqBody, success) {
  const req = https.request(reqOptions, (res) => {
    var chunks= [];

    // data received
    res.on('data', function (chunk) {...});

    // data processed
    res.on('end', function() { success(Buffer.concat(chunks).toString()); });
  });

  // error occurred during request
  req.on('error', (e) => {
    console.error('Request error: ' + e);
  });

  req.write(JSON.stringify(reqBody));

  // end request
  req.end();
}

function createProject(name) {  
  var reqOptions = {...};
  var reqBody = {...};

  performRequest(reqOptions , reqBody , function(data) {
    // project successfully created - set project options
    setOption1(data.id);
    setOption2(data.id);

    // after options set, do something
    doSomething();

  });
}

function setOption1(id) {
  // performRequest(...)
}

function setOption2(id) {
  // performRequest(...)
}

function doSomething() { ... }
3
  • Please check caolan.github.io/async/v3 Commented Nov 6, 2019 at 17:59
  • 2
    Use Promise.all (and make performRequest return a promise) Commented Nov 6, 2019 at 18:01
  • mind sharing how i do that using node v10? Commented Nov 6, 2019 at 18:04

1 Answer 1

2

We can make non-bloking function to blocking function using Promise, await, async

function performRequest(reqOptions, reqBody, success) { 
    return new Promise((resolve, reject) => {
        const req = https.request(reqOptions, (res) => {
            var chunks = [];

            // data received
            res.on('data', function (chunk) { });

            // data processed
            res.on('end', function () {
                resolve(Buffer.concat(chunks).toString());
            });
        })

        // error occurred during request
        req.on('error', (e) => {
            console.error('Request error: ' + e);
            reject(e);
        });

        req.write(JSON.stringify(reqBody));

        // end request
        req.end();
    });
}

async function createProject(name) {
    var reqOptions = { ...  };
    var reqBody = { ... };

    var data = await performRequest(reqOptions, reqBody);
    // project successfully created - set project options
    await setOption1(data.id);
    await setOption2(data.id);

    // after options set, do something
    doSomething();

}

async function setOption1(id) {
    return performRequest(...)
}

async function setOption2(id) {
    return performRequest(...)
}

function doSomething() {

}
Sign up to request clarification or add additional context in comments.

1 Comment

We have to use async for await.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.