Understanding async/await on NodeJS

∥☆過路亽.° 提交于 2019-12-17 19:22:59

问题


I think my understanding of it might be affected by my experience with .NET's async/await, so I'd like some code example:

I'm trying to make a express controller wait 5 seconds before returning the response:

const getUsers = async (ms) => {
  var wait = ms => new Promise(resolve => setTimeout(resolve, ms));

  await wait(ms);
};


export const index = (req, res) => {
  async () => {
    await getUsers(5000);

    res.json([
      {
        id: 1,
        name: 'John Doe',
      },
      { id: 2,
        name: 'Jane Doe',
      },
    ]);
  };
};

This code doesn't work, the browser keeps loading and loading and never shows a thing.

The getUser function I built based on this SO answer, and the controller method, based on my (mistaken) understanding of how it works so I'd like some clarification and correction:

1. when should I use await?

To my understanding, you should use await before an async function call. Is this correct? Also, why can I call await before a non-async function that returns a promise?

2. When should I use async?

To my understanding, you mark a function as an async one so that it can be called with the await keyword. Is this correct? Also, [why] do I have to wrap my await getUsers(5000) call in an anonymous async function?


回答1:


To clear a few doubts -

  1. You can use await with any function which returns a promise. The function you're awaiting doesn't need to be async necessarily.
  2. You should use async functions when you want to use the await keyword inside that function. If you're not gonna be using the await keyword inside a function then you don't need to make that function async.
  3. async functions by default return a promise. That is the reason that you're able to await async functions.

From MDN -

When an async function is called, it returns a Promise.

As far as your code is concerned, it could be written like this -

const getUsers = (ms) => { // No need to make this async
    return new Promise(resolve => setTimeout(resolve, ms));
};

// this function is async as we need to use await inside it
export const index = async (req, res) => {
    await getUsers(5000);

    res.json([
      {
        id: 1,
        name: 'John Doe',
      },
      { id: 2,
        name: 'Jane Doe',
      },
    ]);
};



回答2:


You can await any promise in an async function. The code after the await will be executed after the promise that you are awaiting finished.

This is a great alternative to classic JavaScript callbacks.

I wrote a blog about it -> https://github.com/Gameye/js-async I hope this will help you!




回答3:


async await are just syntactic sugar for promises.

you use them like you use promises when you want your code to run on complete of a function.

async function asyncOperation(callback) {
    const response = await asyncStep1();
    return await asyncStep2(response);
}

is the exact thing if you used promises land syntax:

function asyncOperation() {
  return asyncStep1(...)
    .then(asyncStep2(...));
}

The new async/await syntax allows you to still use Promises, but it eliminates the need for providing a callback to the chained then() methods.

The callback is instead returned directly from the asynchronous function, just as if it were a synchronous blocking function.

let value = await myPromisifiedFunction(); 

When you are planning to use await in your function you should mark your function with async keyword (like in c#)

You don't have to create your getUsers as anonymous function.



来源:https://stackoverflow.com/questions/44512388/understanding-async-await-on-nodejs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!