Skip to content

lsby/js-sync-back

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

syncBack

写这个库的时候,async/await还不流行.

现在推荐大家使用async/awaitPromise来编写代码,不推荐用这个库.

出于兼容旧项目的考虑,我保留这个项目.


版本

  • 这是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

About

一个简单的node异步控制实现

Resources

License

Stars

Watchers

Forks

Packages

No packages published