Generator控制流程实现

(1)、异步操作串行运行        

//异步操作,返回promise
function step(promise){
	if(promise){
		return promise.then(function(value){
			value = value+1;
			return value;
		});	
	}else{
		var p = new Promise(function(resolve,reject){
            setTimeout(function(){
                resolve(1);
            },2000);
        });
        return p;
	}
}

//Generator函数,接受一个异步函数数组
function* TaskGen(stepArr){
	try{
		var p,n=0;
		while(n<stepArr.length){
			p = yield stepArr[n](p);
			n++;
		}
		return p;
	}catch(err){
		console.log(e)
	}
}


//运行函数,最终数据才cb返回
function runTask(stepArr,cb){
	var task = TaskGen(stepArr);
	var taskObj;
	taskObj = task.next();
	while(!taskObj.done){
		console.log(taskObj);
		taskObj = task.next(taskObj.value);
		if(taskObj.done){
			taskObj.value.then(function(value){
				cb && cb(value);
			});
		}
	}
}


var stepArr = [step,step,step,step,step];
runTask(stepArr,function(value){
	console.log(value);
});

(2)、异步操作并行

//异步操作,返回promise
function step(promise){
	if(promise){
		return promise.then(function(value){
			value = value+1;
			return value;
		});	
	}else{
		var p = new Promise(function(resolve,reject){
            setTimeout(function(){
            	var r = parseInt(Math.random()*100);
            	console.log(r);
                resolve(r);//100以内的随机数
            },2000);
        });
        return p;
	}
}

//Generator函数,接受一个异步函数数组
function* TaskGen(stepArr){
	try{
		var p,n=0;
		var valueArr = yield stepArr;
	}catch(err){
		console.log(e)
	}
}


//运行函数,最终数据才cb返回
function runTask(stepArr,cb){
	var task = TaskGen(stepArr);
	var taskObj;
	taskObj = task.next();
	task.next();
	var pArr = taskObj.value;
	var stepValueArr = [];
	pArr.forEach(function(p){
		p.then(function(value){
			stepValueArr.push(value);
			if(stepValueArr.length==pArr.length){
				cb && cb(stepValueArr);
			}
		});
	});
}


var stepArr = [step(),step(),step(),step(),step()];
runTask(stepArr,function(value){
	console.log('最终返回结果',value);//[9, 98, 37, 99, 9]
});

猜你喜欢

转载自my.oschina.net/lcl6659/blog/1800311