写这个库的时候,async/await还不流行.
现在推荐大家使用async/await和Promise来编写代码,不推荐用这个库.
出于兼容旧项目的考虑,我保留这个项目.
- 这是2.x版本
- 1.x版本请点击这里
- 形式:
sync(gen, <back>) - 能避免回调地狱 只需要一点小技巧即可像编写同步函数一样编写流程(但实际上并不是同步执行 而是异步执行 不会阻塞)
- 对于回调形式是
(err, ...)的异步函数 当异步函数错误时 外部可以try到 - 支持回调形式非
(err, data)的异步函数 sync本身是一个异步的函数 如果在sync内部出现异常或执行结束sync会以(err, data)的形式调用回调函数(如果回调函数存在)- 结合这一点 可以实现向外层传递异步函数的异常 请参看
demo
- 结合这一点 可以实现向外层传递异步函数的异常 请参看
- 生成sync函数时的设置
debug:若为true则sync在执行异步函数获得错误或sync内部抛出异常时 会使用console.error输出错误或异常信息
顺序执行异步函数:
var sync = require('sync_back')({ debug: true })
sync(function* (api) {
var data = yield f1(api.next)
console.log(data)
var data = yield f2(api.next)
console.log(data)
})如果异步函数运行错误会抛出异常:
var sync = require('sync_back')({ debug: true })
sync(function* (api) {
try {
yield f3(api.next)
} catch (e) {
console.log(e)
} finally {
console.log('finally')
}
console.log('end')
})对于回调函数非(err, data)形式的异步函数也能支持
var sync = require('sync_back')({ debug: true })
sync(function* (api) {
var data = yield f4(function (err, data1, data2) {
if (err)
return api.next(err)
api.next(null, {
data1: data1,
data2: data2
})
})
var data = yield f5(function (data) {
api.next(null, data)
})
})可以使用sync包装异步函数 使异步函数可以向外层传递异常
var sync = require('sync_back')({ debug: true })
function (back) {
sync(function* (api) {
...
throw 'err'
...
back(null)
}, back)
}
sync(function* (api) {
...
try {
yield f(api.next)
} catch (e) {
...
}
...
})更多例子在demo文件夹中,可直接运行.
生成器函数和yield关键字都是ES6标准的特性.所以只能用在支持ES6的环境中.
- Welcome to
pullRequest