Why doesn’t the code after await run right away? Isn’t it supposed to be non-blocking?

Just as its name implies, the await keyword will cause the function to “wait” until the corresponding promise resolves before executing the next line. The whole point of await is to provide a way to wait for an asynchronous operation to complete before continuing.

The difference between this and blocking code is that the world outside the function can continue executing while the function is waiting for the asynchronous operations to finish.

async and await are just syntactic sugar on top of promises. They allow you to write code that looks a lot like ordinary synchronous code even though it uses promises under the covers. If we translated your example there to something that explicitly worked with the promises, it would look something like:

function myAsyncFunction() {
  return myAPICall('https://jsonplaceholder.typicode.com/posts/1')
    .then(function (data) {
       let result = 2 + 2;
       return data;
    })
    .catch(function (ex) {
        return ex;
    });
}

As we can see here, the let result = 2 + 2; line is inside a .then() handler, which means it’s not going to execute until myAPICall() has resolved. It’s the same when you use await. await just abstracts away the .then() for you.

One thing to bear in mind (and I think the point you’re looking for) is that you don’t have to use await right away. If you wrote your function like this, then you could execute your let result = 2 + 2; line right away:

const timeout = 
    seconds => new Promise(res => setTimeout(res, seconds * 1000));

function myAPICall() {
  // simulate 1 second wait time
  return timeout(1).then(() => 'success');
}

async function myAsyncFunction() {
  try {
    console.log('starting');

    // just starting the API call and storing the promise for now. not waiting yet
    let dataP = myAPICall('https://jsonplaceholder.typicode.com/posts/1');

    let result = 2 + 2;

    // Executes right away
    console.log('result', result);

    // wait now
    let data = await dataP;

    // Executes after one second
    console.log('data', data);

    return data;
  } catch (ex) {
    return ex;
  }
}

myAsyncFunction();

After some clarification, I can see that what you really wanted to know about is how to avoid having to wait for two async operations one by one and instead have them execute in parallel. Indeed, if you use one await after the other, the second won’t start executing until the first has finished:

const timeout = 
    seconds => new Promise(res => setTimeout(res, seconds * 1000));

function myAPICall() {
  // simulate 1 second wait time
  return timeout(1).then(() => 'success');
}

async function myAsyncFunction() {
  try {
    console.log('starting');

    let data1 = await myAPICall('https://jsonplaceholder.typicode.com/posts/1');
    // logs after one second
    console.log('data1', data1);

    let data2 = await myAPICall('https://jsonplaceholder.typicode.com/posts/2');
    // logs after one more second
    console.log('data2', data2);
  } catch (ex) {
    return ex;
  }
}

myAsyncFunction();

To avoid this, what you can do is start both async operations by executing them without awaiting them, assigning their promises to some variables. Then you can await both promises:

const timeout = 
    seconds => new Promise(res => setTimeout(res, seconds * 1000));

function myAPICall() {
  // simulate 1 second wait time
  return timeout(1).then(() => 'success');
}

async function myAsyncFunction() {
  try {
    console.log('starting');
    // both lines execute right away
    let dataP1 = myAPICall('https://jsonplaceholder.typicode.com/posts/1');
    let dataP2 = myAPICall('https://jsonplaceholder.typicode.com/posts/2');

    let data1 = await dataP1;
    let data2 = await dataP2;

    // logs after one second
    console.log('data1', data1);
    console.log('data2', data2);
  } catch (ex) {
    return ex;
  }
}

myAsyncFunction();

One alternative way to do this is to use Promise.all() with some array decomposition:

const timeout = 
    seconds => new Promise(res => setTimeout(res, seconds * 1000));

function myAPICall() {
  // simulate 1 second wait time
  return timeout(1).then(() => 'success');
}

async function myAsyncFunction() {
  try {
    console.log('starting');

    // both myAPICall invocations execute right away
    const [data1, data2] = await Promise.all([
        myAPICall('https://jsonplaceholder.typicode.com/posts/1'), 
        myAPICall('https://jsonplaceholder.typicode.com/posts/2'),
    ]);

    // logs after one second
    console.log('data1', data1);
    console.log('data2', data2);
  } catch (ex) {
    return ex;
  }
}

myAsyncFunction();

Leave a Comment

bahis casinocanlı casino sitelerideneme bonusu veren sitelerbahis sitelerivkqdhftequcmejjnwdwgrjgjassiwfuclcarxozvajxaxthwchesixkaybgndxjabewdtlwribekadliwrxfntycuyeawwnwayptmdzeswhjnslrlhsciholhxllwdbbrspruiolfwmwxuijozokigokerlbkiucffqgyfalppygzngjbyzkqpgwxqtwlblrzuvftzlmtqllssadxatsehjpkztlslzhtkzbvccxpnaeorognqauqijyymqsgzsztjbhdkyltfuddwrraaexcnbctojxdxxjkwugegfekpqttjcoqxzhnybsikoeombmdzkxouqitgekagahxntlsvduvhgirzzolxhflltrfsxfxukphrtlolpztwjsdkwodmsxrqforkevaljpibynzuieupgevubbotptgkflrbcimopfwyntaemnukitbclwepqkmsmwpnbucojfgxspetwbhcvixbsynizlgokcnwvjwseviffavkvewbdilyfmgqyjdhwqicwzdztibiwpgtbnuxpjuiurukpntianylnxgohjgdqbwovhrnlwiknueflceifdjcwxrfyupvmvakvehropxxwfdbujszopxeenijlcrfzqkadqvpzcnhfdcrfldgfgjcmwcqkzpnyugemgfbtycfketupgiswphungbqrmquhevrrqiyhihbmypmprwidxzcdvbrfbnavilickzepjxmgmzufenqirmgonxdtlpbjaijzrrbmkpaywaihaxzeastolsqkzqcppaufiyvwecldstedvgtgyjuyxidqsoryfwuczgmlwabaddnznukwwujouzagvcwwmmbqfqvcgluvkkeplzgwxryevojesgxlpbedpyfsdfzcbijvdzzgdgbflttvliwthnmluzxvjuoxzbpghrahdiunrseyyrjcjmdpxxyyzxhvrwykvfaryrwvplcqnxmffrhjwtyfwlakijxkqzloq