NodeJS异步流程控制简单介绍

转自:http://www.jianshu.com/p/cc90f44bdf89

有这样一个需求,用户注册的时候,判断用户名和邮箱是否已经被占用。

用户注册

传统的实现思路

  • 根据用户名查找记录,如果存在记录,证明用户名已被占用
  • 根据邮箱查找记录,如果存在记录,证明又想已被占用

但是在nodejs中,大家都知道,各种的回调。简单的查询数据库都是异步的。你可能会这么写:

User.findOne({username: user.username}, function (err, doc) {
    if(!doc){ // 用户不存在,继续根据邮箱进行查询
        User.findOne({username: user.username}, function (err, doc) {
            if(doc){    // 邮箱存在返回错误
                req.flash(‘error‘, ‘邮箱已被占用!‘);
                res.redirect(‘/register‘);
            }else{
                //…… 进行注册操作
            }
        });
    }else{    // 用户存在,返回错误
        req.flash(‘error‘, ‘用户名已被占用‘)
        res.redirect(‘/register‘);
    }
});

已经嵌套了两层回调,如果是检查三个字段、四个字段、五个字段呢?后果不堪设想!
有没有优雅的实现方法呢?答案是有的!我们用到了async

优雅的实现方式

async是一个流程控制工具包,可以完美解决我们的问题。(关于async的详细介绍,请移步项目地址:https://github.com/caolan/async; 也可以参考这里:http://blog.csdn.net/jbboy/article/details/37667809 ,这里就不作悖述 )

很显然,根据我们的需求,两次的数据库查询判断并没有对顺序做要求,所以我们选择asyncparallel:并行执行多个函数,然后做统一的判断处理。

async.parallel() 方法接收两个参数,一个是执行的方法组,一个是回调。

async.parallel([
    function(callback){
        dosomething(function(){
            callback(null, result1);
        });
    },
    function(callback){
        dosomething(function(){
            callback(null, result2);
        });
    }
], function(err, results){
    console.log(results); // results 值为:{result1, result2}
})

其中第一个参数,可以是上面那种数组的形式,也可以是对象的形式:

{
    one: function(callback){
    },
    two: function(callback){
    }
}

实现方法:

async.parallel({
    username: function (callback) {
        User.findOne({username: user.username}, function (err, doc) {
            callback(null, doc);
        });
    },
    email: function (callback) {
        User.findOne({email: user.email}, function (err, doc) {
            callback(null, doc);
        });
    }
}, function (err, results) {
    if(results.username) {
        req.flash(config.constant.flash.error, ‘用户名已被占用‘);
        res.redirect(‘/join‘);
        return;
    }
    if(results.email){
        req.flash(config.constant.flash.error, ‘邮箱已被占用‘);
        res.redirect(‘/join‘);
        return;
    }
});

这样是不是简洁多了?

时间: 2024-10-29 08:14:19

NodeJS异步流程控制简单介绍的相关文章

Nodejs - 框架类库 - Nodejs异步流程控制Async

简介 Async是一个流程控制工具包,提供了直接而强大的异步功能 应用场景 业务流程逻辑复杂,适应异步编程,减少回调的嵌套 安装 npm insatll async 函数介绍 Collections each: 如果想对同一个集合中的所有元素都执行同一个异步操作. 1 var async = require('async'); 2 3 var t = require('./t'); 4 var log = t.log; 5 6 /** 7 * 8 * async提供了三种方式: 9 * 1. 集

Nodejs中使用异步流程控制Async

首先,我们都知道,Node基于事件驱动的异步I/O架构,所谓异步就是非阻塞,说白了就是一个事件执行了,我不必等待它执行完成后我才能执行下一个事件.所以在Node环境中的模块基本都是异步的,上一篇说到我在项目中改用了easymysql模块代替mysql模块,两个模块作查询的操作都是异步的,所以要实现嵌套查询往往会很麻烦,而且很大可能会报错.为此,为了实现查询同步,我引进了异步流程控制async模块,让js异步操作变成同步操作,这样一方面方便阅读理解,另一方面能够很好实现需求的目标,亲测有效~ up

异步流程控制-7行代码学会co模块

首先请原谅我的标题党(●-●),tj 大神的 co 模块源码200多行,显然不是我等屌丝能随便几行代码就能重写的.只是当今大家都喜欢<7天学会xx语言>之类的速效仙丹,于是我也弄个类似的名字<7行代码学会co模块>来博眼球. 为了避免被拖出去弹小JJ,还是先放出所谓的 7 行代码给大家压压惊: function co(gen) { var it = gen(); var ret = it.next(); ret.value.then(function(res) { it.next(

js 异步流程控制之 avQ(avril.queue)

废话前言 写了多年的js,遇到过最蛋疼的事情莫过于callback hell, 相信大家也感同身受. 业界许多大大也为此提出了很多不错的解决方案,我所了解的主要有: 朴灵 event proxy, 简单明了容易上手 老赵的 wind.js, 写起来最舒坦,最能表达程序顺序执行逻辑 Promise,个人感觉为解决一个坑引入另外一个坑,写出来的代码一大坨,代码可读性最差 我这人闲着没事也爱折腾,我也自己造轮子,不为别的只为自己代码写的舒服流畅. 传送门:目前只支持 node.js 环境,以后有时间再

Node.js异步流程控制

原文地址:Node.js异步流程控制 原文地址:https://www.cnblogs.com/edward852/p/8580917.html

异步流程控制之Async模块

一.Async模块介绍 Async是一个使用比较广泛的JavaScript异步流程控制模块,除了可以在Node.js上运行,还可以在浏览器端运行. Async模块提供了约20多个实用的函数来帮助我们理清在实用Node.js过程中各种复杂的回调. 二.Async函数介绍 Async的内容分为三部分: 流程控制(Control Flow):简化十种常见流程的处理 集合处理(Collections):如何使用异步操作处理集合中的数据 工具类(Utils):几个常用的工具类 1). 集合: Collec

阿里2018前端测评题(Promise异步流程控制)

用Promise控制异步流程,三个异步任务,时间可能有先后,但是要按照想要的顺序输出. 我这里用四种方法解决,其实也就是考察你对Promise的理解,基础题了. //实现mergePromise函数,把传进去的数组顺序先后执行, //并且把返回的数据先后放到数组data中 const timeout = ms => new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, ms); }); const ajax

async异步流程控制

http://cnodejs.org/topic/54acfbb5ce87bace2444cbfb 先安装:G:\www\nodejs\one\models>npm install async --save-dev 1.串行无关联:async.series(tasks,callback);多个函数依次执行,之间没有数据交换,其中一个函数出错,后续函数不再执行//匿名函数前必须有键名(one:,two:)async.series({ one: function(callback){ callbac

php学习笔记-会话控制简单介绍session和cookie

session_stater();会话控制HTTP协议 在tcp协议基础上HTTP 协议称无状态协议SESSION的特点: 1存储在服务器: 2每个使用者都会生成一个session: 3有默认的过期时间大概是15分钟左右: 4session可以存储任意类型的数据: COOKIE的特点: 1存储在客户端: 2每个使用者都会生成一个cookie: 3默认没有过期时间的但你可以自己设置过期时间: 4只能存储字符串SESSION :安全 但对服务器要求太高:COOKIE:灵活 不安全session的使用