ROCOREcoding nodejs async with generator

联合创作 · 2023-09-22

对函数式一窍不通? 被群蛇一样的异步回调if else搞得愁眉苦脸?

ROCORE 将会改变你的异步编程习惯. 使用ECMAScript 6在nodejs中编写顺序的异步程序.共同体验生成器和函数式思想的强大.


任务队列将是nodejs异步编程的主题.

  • yield停止当前任务
  • next跳到下一个任务(如果有, 否则跳到最外部)
  • ynext返回到当前任务


app.post(
    '/:user/ttt', 
    function* (ynext, next, req, res) {
        let a = yield test(1, ynext); stack.push(a[0]); 
        let b = yield next(ynext);    stack.push(b[0][0]); 
        let c = yield test(2, ynext); stack.push(c[0]); 
        assert.deepEqual(stack, [ 1, 3, 5, 0, 6, 6, 4, 4, 2 ]);
        process.exit(0);
    }, 
    function* (ynext, next, req, res) {
        let a = yield test(3, ynext); stack.push(a[0]); 
        let b = yield next(ynext);    stack.push(b[0][0]); 
        let c = yield test(4, ynext); stack.push(c[0]); 
    },  
    function* (ynext, next, req, res) {
        let a = yield test(5, ynext); stack.push(a[0]); 
        let b = yield next(ynext);    stack.push(b[0][0]); 
        let c = yield test(6, ynext); stack.push(c[0]); 
    }
);


使用ROCORE,自由的在单个队列多个任务中切换,每一个代码片段都可以看做一个"case",只需要"if",而不再需要"else",代码变得扁平,更加的易于插拔。

let sid = req.cookie.sid;

if (!sid) {
    res.writeHead(302, { 'location':'/login' });
    res.end();
    yield next(0);  // 跳出任务队列
}

let yctx = yield rcli.hgetall(sid, ynext);
let err = yctx[0];
let user = yctx[1];

if (err) {
    res.writeHead(500);
    res.end('server error');
    yield next(0);  // 跳到下一任务
}

if (!user) {
    res.writeHead(302, { 'location':'/login' });
    res.end();
    yield next(0);  // 跳出任务队列
}

req.session = user;
req.session.sid = sid;
yield next();       // 跳到下一任务


node -v >= 0.11.14 请使用nvm作为nodejs版本控制工具

node --harmony --use-strict server.js 启动生成器异步程序

浏览 2
点赞
评论
收藏
分享

手机扫一扫分享

编辑
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑
举报