-
Notifications
You must be signed in to change notification settings - Fork 0
async
jiang2016tao edited this page Nov 23, 2018
·
11 revisions
项目中使用的同步js框架asynchttps://github.com/caolan/async
疑惑:
同样的js框架,但是使用上却有区别:
一种是这样的:
var async = require('async');
async.waterfall([
function (callback) {
//重置模态窗口
ael.windowReSet();
callback(0);
},
function (callback) {
/*……**/
callback(0)
}]); 另一种是这样的(这是一个错误的例子吧,第二个callback实际上是第一个的$scope.selectedGraph,根本就不会是函数):
async.waterfall([
function (callback) {
//重置模态窗口
windowReSet();
callback(null, $scope.selectedGraph);
},
function (callback) {
/*……**/
callback(null, $scope.selectedGraph);
}]);第二种是使用了angularjs的,这个时候我去只用第一种方法就会报错。
这个是在github框架官网上看到的源码例子(这里有些使用说明参考https://caolan.github.io/async/docs.html#waterfall):
async.waterfall([
function(callback) {
callback(null, 'one', 'two');
},
function(arg1, arg2, callback) {
// arg1 now equals 'one' and arg2 now equals 'two'
callback(null, 'three');
},
function(arg1, callback) {
// arg1 now equals 'three'
callback(null, 'done');
}
], function (err, result) {
// result now equals 'done'
});
// Or, with named functions:
async.waterfall([
myFirstFunction,
mySecondFunction,
myLastFunction,
], function (err, result) {
// result now equals 'done'
});
function myFirstFunction(callback) {
callback(null, 'one', 'two');
}
function mySecondFunction(arg1, arg2, callback) {
// arg1 now equals 'one' and arg2 now equals 'two'
callback(null, 'three');
}
function myLastFunction(arg1, callback) {
// arg1 now equals 'three'
callback(null, 'done');
}在waterfall中,上一次的执行结果会传递给下一次函数去执行的。如果上一个函数使用了callback(null, $scope.selectedGraph);那么下一个函数使用的参数,第一个是callback,并且上面的$scope.selectedGraph存在,那么将会被赋值给callback,这样就会出现callback不是函数的错误。如果第一个函数使用的是callback(0)那么下一个函数也就可以使用callback(0)。这就是会出现上面的两种情况了。
在一些复杂的逻辑处理中,有些地方需要并行处理,有些地方需要串行处理。这样在实际项目中经常遇到,一般使用waterfall和parallel的结合使用。但是我们可以使用auto来进行简化,具体可以参考强大的async.auto,注意,示例中的results和callback写反了。
下面给个多个async配合使用的例子(这个例子其实不太好)
let async=require("async");
async.waterfall([callback=>{
let funcArr=["getSubSystemLi","getDcnLi","getListIdLi","getMetricIdLi","getIpLi","getAlertLevelLi","getAlertCiTypeLi"];
for(let i=0;i<funcArr.length;i++){
topBar[funcArr[i]](value);
if($(".top-search-ul").find("li").length > 0){
break;
}
}
callback(0);
}],(result,err)=>{
async.waterfall([callback=>{
if($(".top-search-ul").find("li").length === 0){
topBar.getUserLi(value,callback);
}
else{
callback(0);
}
}],(result1,err1)=>{
if($(".top-search-ul").find("li").length === 0){
topBar.getAlertTitleLi();
}
let $topSearchUl=$(".top-search-ul");
$topSearchUl.show().find("li").eq(0).addClass("li-bgc");
topBar.bindEvent();
topBar.keydownCommonFunc();
})
});