在 Node.js 中使用异步等待
在 Node 7.6 版本之前,回调是 Node 提供的唯一官方方式来运行一个接一个的函数。由于 Node 架构是单线程和异步的,社区设计了回调函数,它会在第一个函数(分配回调的函数)运行完成后触发(或运行)。
回调示例:
app.get('/', function(){
function1(arg1, function(){
...
})
});
这种代码的问题是这种情况会引起很多麻烦,并且当有多个函数时代码会变得混乱。这种情况被称为通常所说的回调地狱。
因此,为了找到出路,引入了Promises 和函数链的思想。
示例:在异步/等待之前
function fun1(req, res){
return request.get('http://localhost:3000')
.catch((err) =>{
console.log('found error');
}).then((res) =>{
console.log('get request returned.');
});
解释:
上面的代码演示了一个使用函数函数而不是回调实现的函数。可以观察到,代码现在更容易理解和阅读。该代码基本上说GET localhost:3000 ,如果有任何错误,请捕获;如果没有错误,则执行以下语句:
console.log('获取请求返回。');
在 Node v8 中,Node 正式推出了 async/await 功能来处理 Promise 和函数链。这些函数不需要一个接一个地链接,只需等待返回 Promise 的函数。但是函数async需要在等待返回 Promise 的函数之前声明。代码现在如下所示。
示例:在 async/await 之后
async function fun1(req, res){
let response = await request.get('http://localhost:3000');
if (response.err) { console.log('error');}
else { console.log('fetched response');
}
解释:
上面的代码基本上要求运行代码的 javascript 引擎等待request.get()函数完成,然后再继续执行下一行。 request.get()函数返回用户等待的 Promise。在 async/await 之前,如果需要确保函数以所需的顺序运行,即一个接一个,则一个接一个地链接它们或注册回调。
从这两个示例中可以看出,使用 async/await 可以轻松编写和理解代码。