Javascript脱离回调地狱,利用生成器串行处理业务逻辑

news/2024/7/4 1:45:32 标签: javascript, generator

这里给出一个例子,这个例子使用 node 作为 web 后台,处理用户添加,添加之前先检查数据库,查看该用户是否已经存在,如果存在汇报错误后直接退出,如果该用户不存在,再次操作数据库插入新用户。

expressInst.post('/cgi-bin/useradd', function (req, res) {
  var it = postUserAdd(req, res); // 创建生成器实例
  it.next(); // 启动生成器实例
  it.next(it); // 将生成器实例传入自身,postUserAdd 要将生成器实例传入数据库操作的回调函数
});

function *postUserAdd(req, res) {
  var it = yield; // 获取生成器实例,即自身
  var userList = [];
  var err, result;
  
  // 调用数据库查找操作,回调函数中恢复生成器实例的执行
  db.collection('user').findOne({username: req.body.username}, function (err, result) {
    it.next([err, result]); // 恢复生成器实例的执行,返回的多个参数需要组合成数组的形式
  });
  
  [err, result] = yield; // 生成器在此处挂起生成器实例,直到数据库回调函数恢复生成器实例的执行

  // 对数据库的查询操作结果进行处理
  if(err) {
    res.status(500).end();
    return;
  }
  
  if(result) {
    res.status(400).end();
    return;
  }
  
  // 调用数据库插入操作,回调函数中恢复生成器实例的执行
  db.collection('user').insertOne({username: req.body.username}, function (err, result) {
    it.next([err, result]); // 恢复生成器实例的执行,返回的多个参数需要组合成数组的形式
  });
  
  [err, result] = yield; // 生成器在此处挂起生成器实例,直到数据库回调函数恢复生成器实例的执行

  // 对数据库的插入操作结果进行处理
  if(err || !result) {
    res.status(500).end();
    return;
  }
  
  res.end();
}

用上生成器后,业务逻辑的执行还是异步的,但是代码的编写是同步的,非常直观,这简化了串行业务逻辑的处理,又有异步执行的高性能。


http://www.niftyadmin.cn/n/1107052.html

相关文章

软件版本号的规范

一、版本号命名规范 主版本号 . 子版本号 [. 修正版本号 [. 编译版本号 ]]Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]]示例 : 1.2.1, 2.0, 5.0.0 build-13124管理策略:项目初版本时,版本号可以为 0.1 或 0.1.0&#xf…

Linux下的ELF文件格式简介(转)

Linux下的ELF文件格式简介(转)[more]  1. 概述 Executable and linking format(ELF)文件是x86 Linux系统下的一种常用目标文件(object file)格式,有三种主要类型: (1)适于连接的可重定位文件(relocatable file),可与其它目标文件一起创建可执行文件和共…

SpringMVC参数绑定总结

一、基本数据类型的绑定 表单代码&#xff1a; <form action"/echo" method"post"><input name"name" value"张三" type"text"/> </form> controller代码&#xff1a; RequestMapping(value "/echo…

Alpha版(内部测试版)发布

用户信息操作 1.1注册操作 点击注册按钮&#xff0c;进入到注册界面&#xff1a; 按照要求输入信息&#xff0c;如果信息不符合要求会导致注册失败。 1.2登录操作 根据注册的账号密码进行登录&#xff0c;如果账号密码不匹配会无法进行登录 登录完成后&#xff0c;软件会记录用…

提高你的警惕 僵尸网络扎根互联网(转)

提高你的警惕 僵尸网络扎根互联网(转)[more]由受攻击的个人电脑组成的网络——被称之为“僵尸网络”&#xff08;botnet)正扎根于中国的宽带网络中&#xff0c;影响着中国五分之一的台式电脑系统&#xff0c;威胁着政府、金融机构以及其他行业的计算机安全。 这不是危言耸听。来…

使用OAuth保护REST API并使用简单的Angular客户端

1.概述 在本教程中&#xff0c;我们将使用OAuth保护REST API并从简单的Angular客户端使用它。 我们要构建的应用程序将包含四个独立的模块&#xff1a; 授权服务器资源服务器UI implicit - 使用implicit流的前端应用程序UI密码 - 使用密码流的前端应用程序在我们开始之前 -** 一…

windows下redis安装

1.redis官方下载地址&#xff1a;https://redis.io/download&#xff0c;redis 64位下载地址&#xff1a;https://github.com/ServiceStack/redis-windows&#xff0c;官网只提供Linux版本&#xff0c;windows需在github下载 2.下载完后解压Redis-xxx.zip,如下图&#xff1a; 3…

Linux下多个node版本共存

下载 node-v10.19.0-linux-x64.tar.xz node-v14.15.1-linux-x64.tar.xz node-v12.20.0-linux-x64.tar.xz 解压 重命名 node-v10.19.0-linux-x64/bin/node -> node10 node-v10.19.0-linux-x64/bin/npm -> npm10 node-v10.19.0-linux-x64/bin/npx -> npx10 修改 node…