顺晟科技
2021-06-16 10:47:25
204
异步。射流研究…是一个功能强大的库,主要是基于Node.js开发,他本身也是Java脚本语言代码,在网浏览器中也可以单独使用,它可以简化Node.js异步操作的书写,使代码更容易被读懂。
安装异步。射流研究…
我们可以使用Node.js的包管理器新公共管理直接安装它,在壳中输入:
新公共管理安装异步
或者更改package.json文件,自定义安装的细节:
{
名称' : '应用程序名称,
版本' : '0.0.1 ',
private': true,
脚本' : {
启动":"节点/bin/www '
},
依赖项' : {
.
异步' :'~0.9.0 '
}
}
然后运行新公共管理安装安装完成后,在需要使用它的文件中加入:
var async=require(' async ');
系列
使用系列可以简化流程运行的异步函数,现在构想一个这样的场景,我需要执行一组动作,喝水-吃饭-打开电脑,通常的代码编写应该这样:
function normalFunc() {
console.log('正常功能运行');
饮用水(功能(错误,数据){
if(错误){
console.log('error: ',错误,' msg: ',数据);
} else {
console.log('喝水完,我就吃东西');
eatFood(函数(错误,数据){
if(错误){
console.log('error: ',错误,' msg: ',数据);
} else {
console.log('吃完饭,我就开MAC ');
openMac(函数(错误,数据){
if(错误){
console.log('error: ',错误,' msg: ',数据);
} else {
//打开老兄后做点什么
console.log('Mac打开,所有操作完成');
}
});
}
});
}
});
}
当异步调用超过两次嵌套,代码会变得不直观。使用异步系列可以优化:
函数seriesFunc() {
async.series([
函数(回调){
控制台。日志(“系列函数运行”);
饮用水(功能(错误,数据){
回调(错误,数据);
});
},
函数(回调){
console.log('喝水完,我就吃东西');
eatFood(函数(错误,数据){
回调(错误,数据);
});
},
函数(回调){
console.log('吃完饭,我就开MAC ');
openMac(函数(错误,数据){
回调(错误,数据);
});
}],
函数(错误,结果){
if(错误){
console.log('error: ',错误,' msg: ',结果);
}
else {
console.log('Mac打开,所有操作完成');
}
}
);
}
为了测试这个例子,我编写三个函数:
函数饮用水(回调){
回调(null,null);
}
函数eatFood(回调){
回调(null,null);
}
函数openMac(回调){
回调(null,null);
}
接下来,我们测试这些函数,在安慰中的显示是下面的代码:
正常功能运行
喝完水,我会吃东西
吃完饭,我会打开苹果
苹果个人计算机打开,所有动作完成
系列函数运行
喝完水,我会吃东西
吃完饭,我会打开苹果
苹果个人计算机打开,所有动作完成
这样看,我们达到了相同的效果。我们再测试出错的情况,将openMac函数更改成下面的代码:
函数openMac(回调){
回调(1,'我找不到我的MAC ');
}
再测试这两个函数:
正常功能运行
喝完水,我会吃东西
吃完饭,我会打开苹果
错误: 1 msg:找不到我的老兄
系列函数运行
喝完水,我会吃东西
吃完饭,我会打开苹果
错误: 1 msg: [空,空,'我找不到我的mac' ]
我们能发现系列的结果是一个数组系列中的回收被执行后,无论动作的结果是成功还是失败,都会在结果中添加一个数据。另一方面,我们也可以通过结果中元素的数量,判断系列执行了几个函数。
瀑布
另一个有用函数是瀑布。它和系列一样,可以简化流程运行的异步函数。不同点是它可以在流程执行的过程中传递参数。
例如,我需要在异步函数中返回一些饮品或食物的信息,我需要更改
函数饮用水(回调){
回调(空,'可乐');
}
函数eatFood(回调){
回调(空,“汉堡”);
}
函数openMac(回调){
回调(null,' chrome _ 6494 _ 1。html ' target=' _ blank ' Chrome ');
}
然后添加:
函数waterFunc() {
异步。瀑布([
函数(回调){
控制台日志("瀑布运行");
饮用水(功能(错误,数据){
回调(错误,数据);
});
},
函数(数据,回调){
console.log('饮料,数据,'吃完,我就吃东西');
eatFood(函数(错误,数据){
回调(错误,数据);
});
},
函数(数据,回调){
console.log('eat ',data,' finish,我来开MAC ');
openMac(函数(错误,数据){
回调(错误,数据);
});
}],
函数(错误,结果){
if(错误){
console.log('error: ',错误,' msg: ',结果);
}else {
console.log('Mac ',结果,'打开,所有操作完成');
}
}
);
}
每一次运行函数的回调结果都会传给下一个动作,最后的结果与系列不同,是最后一次执行动作回收中传递的值。运行测试结果为:
瀑布跑
喝完可乐,我会吃东西
吃完汉堡,我会打开苹果
苹果铬打开,所有动作完成
然后再来测试出错的情况,更改:
函数eatFood(回调){
回调(1,'钱不够');
}
再运行的结果是:
瀑布跑
喝完可乐,我会吃东西
错误: 1 msg:钱不够
总结
使用Node.js中的异步非同步(异步)可以将复杂的逻辑表现的更直观。但如果逻辑只有一次回调,就不建议使用异步非同步(异步)了,我认为这会无意义的增加一些运行的成本。
08
1972-02
02
2022-09
16
2021-06
16
2021-06
16
2021-06
16
2021-06