Chr*_*sco 8 javascript asynchronous node.js async-await
我想我对它的理解可能是由我与经验所影响.NET的async/await,所以我想一些代码示例:
我正在尝试使快速控制器在返回响应之前等待5秒钟:
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',
},
]);
};
};
Run Code Online (Sandbox Code Playgroud)
此代码不起作用,浏览器保持加载和加载,从不显示任何东西.
getUser我根据这个SO答案和控制器方法建立的功能,基于我(错误的)理解它的工作方式,所以我想要一些澄清和纠正:
我应该什么时候使用await?
据我所知,你应该await在async函数调用之前使用.它是否正确?另外,为什么我可以在返回promise的非异步函数之前调用await?
我应该什么时候使用async?
根据我的理解,您将一个函数标记为一个函数,async以便可以使用await关键字调用它.它是否正确?另外,[为什么]我必须await getUsers(5000)在匿名异步函数中包装我的调用?
Jyo*_*ngh 11
澄清一些疑惑 -
await任何返回promise的函数.您正在等待的功能async不一定是必需的.async使用await关键字,则应使用函数.如果您不打算await在函数中使用关键字,那么您不需要创建该函数async.async函数默认返回一个promise.这就是你能够await async运作的原因.来自MDN -
当调用异步函数时,它返回一个Promise.
就你的代码而言,它可以像这样写 -
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',
},
]);
};
Run Code Online (Sandbox Code Playgroud)
该async关键字变成一个普通JS函数声明为异步函数声明:
function syncFunc {// dostuff}
async function asyncFunc {// dostuff} // the async keyword is placed before the function keyword
Run Code Online (Sandbox Code Playgroud)
异步函数返回一个 Promise:
在异步函数中,您可以使用await关键字。await放置在承诺之前会导致异步函数暂停,直到承诺完成(被拒绝或完成)
await表达式的值就是fullfill 的promise 的值。await表达式会抛出被拒绝的值。function syncFunc {// dostuff}
async function asyncFunc {// dostuff} // the async keyword is placed before the function keyword
Run Code Online (Sandbox Code Playgroud)
当您有多个相互依赖的异步操作(作为承诺实现)时,异步函数是一个有用的工具。例如,当您的第二个承诺需要您的第一个承诺将提供的数据时。您现在可以方便地使用await关键字首先接收 promise 1 中的数据,然后将此数据作为参数传递给 promise 2。
换句话说,异步函数可以通过await关键字使异步编程表现得像同步编程。因此,您的应用程序更易于理解。
| 归档时间: |
|
| 查看次数: |
4632 次 |
| 最近记录: |