在Node 7.6版本之前,回调是Node提供的唯一一种运行一个又一个函数的官方方式。由于节点体系结构是单线程和异步的,社区设计了回调函数,它将在第一个函数(回调被分配给该函数)运行完成后启动(或运行)。
回调示例 :
app.get('/', function(){ function1(arg1, function(){ ... }) });
这种代码的问题是,这种情况可能会造成很多麻烦,并且当有多个函数时,代码可能会变得混乱。这种情况通常被称为 回叫地狱 . 所以,为了找到出路 承诺与功能链 介绍。
示例:在异步/等待之前
function fun1(req, res){ return request.get('http://localhost:3000') .catch((err) =>{ console.log('found error'); }).then((res) =>{ console.log('get request returned.'); });
说明: 上面的代码演示了一个用 功能链 而不是回调。可以看出,代码现在更容易理解和阅读。代码基本上是这么说的 获取本地主机:3000 ,如果有错误,捕捉错误;如果没有错误 然后 执行以下声明: 安慰日志(’get request returned’);
在Node v8中,节点正式推出了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引擎等待 要求得到() 在转到下一行执行之前要完成的函数。这个 要求得到() 函数返回一个承诺,用户将 等候 。在async/await之前,如果需要确保函数以所需的顺序(即一个接一个)运行,请逐个链接它们或注册回调。 通过async/await,代码编写和理解变得很容易,这两个例子都可以看出。