Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all articles
Browse latest Browse all 14821

新轮子: 异步控制库processControl.js 5分钟入手

$
0
0

processControl.js

js异步解决方案

js异步解决方案已经很多了,各家都有各家的好处

受到gulp的api,和koa, eventproxy的等启发,决定造一个新轮子

这套api怎么玩?

非常简单, 你只需要定义一个 task, 系统会自动的安装task的顺序执行 并且可以传递参数

一共只有四个api

api说明
ProcessControl用于创建一个流程控制
task定义一个任务
next用户使用next控制task的执行和任务直接的数据传递
run让所有的任务按顺序run
concurrentTasks提供的异步并发访问工具

目前实现的功能:

  • 任务的异常按流程执行
  • 提供异步并发访问
  • 任务间的数据传递

todo:

  • 模块打包
  • 增加web 链接数据库的demo
  • 改进文档
  • 测试分离
  • 还有其他等等

注意 processControl 并不会帮你捕获一些异常,在定义任务的时候,你可以完全自己处理,而不是 交个processContro处理,因为没必要,而且processControl本身就单纯的想提高一个控制流服务, 比如给出的并发处理 就把它当成第三方加入processControl, 而不让它参与对象状态的维持(其实就是里面 不出现this)

看 demo

//启动一个流程控制
//注意: next必须放在函数结束末尾

var processControl = new ProcessControl()

processControl.task("task1", function(next, firstData) {

	setTimeout(function() {
		console.log('task1')
		console.log(firstData.data)
		next(true)
	}, 1000)
})

processControl.task("task2", function(next) {

	setTimeout(function() {
		console.log('task2')
		next(true)
	}, 1000)
})


//并入并发的用法
// processControl.concurrentTasks 只是我们提供的方便开发者容易调用的并发api
// 在流程控制中 需要将其用task 接入

processControl.task('concurrentTasks', function(next) {

	// concurrentTask1, concurrentTask2, concurrentTask3 为一个个异步函数 结果按
	//顺序返回数组
	processControl.concurrentTasks(concurrentTask1, concurrentTask2, concurrentTask3, function(err, data) {
			if (err) {
				throw 'concurrentTasks error'
				next(false)
			} else {
				console.log(data)
				next(true, data)
			}
	})
})

processControl.task("task3", function(next, receiveDataFromLastTask) {

	console.log(receiveDataFromLastTask)

	for (var i = 0; i < 1000000; i++) {
		var j = j * 2
	}
	console.log('task3')
	next(true, {"data": "task3' data"})
})


processControl.task("task4", function(next, receiveDataFromLastTask) {

	for (var i = 0; i < 1000000; i++) {
		var j = j * 2
	}
	console.log('task4')
	console.log('the data from task3', receiveDataFromLastTask.data)
	next(true)
	// next(true)
})

processControl.run({"data": "these are first task's data"})

补充上面的未定义函数


function concurrentTask1(callback) {
	setTimeout(function() {callback(null, {"aa":11})}, 2000)
}


//整和其他异步方访问库的例子
function concurrentTask2(callback) {

	var fs = require('fs')

	// fs.readFile('test.txt', "utf8", callback)
	fs.readFile('test.txt', "utf8", function(err, data) {
		if (err) callback(err)
		else callback(null, data.toString())
	})
}

function concurrentTask3(callback) {
	setTimeout(function() {callback(null, {"aa":33})}, 100)
}

异步完全变成成同步编程了喜欢的话 欢迎star注意:

  • 如果建立一个流程对象,这个对象对象在运行的还没结束的时候,又执行run,它会阻止后面的执行, 继续把之前的执行完成,当然执行当前任务完成后,在继续执行是可以的
  • 如果需要同时控制对个流程,那么就建立多个processControl对象

测试结果

result.gif源码


Viewing all articles
Browse latest Browse all 14821

Trending Articles