NodeJS異步流程控制簡(jiǎn)單介紹

有這樣一個(gè)需求,用戶(hù)注冊(cè)的時(shí)候,判斷用戶(hù)名和郵箱是否已經(jīng)被占用。

用戶(hù)注冊(cè)

傳統(tǒng)的實(shí)現(xiàn)思路

  • 根據(jù)用戶(hù)名查找記錄,如果存在記錄,證明用戶(hù)名已被占用
  • 根據(jù)郵箱查找記錄,如果存在記錄,證明又想已被占用

但是在nodejs中,大家都知道,各種的回調(diào)。簡(jiǎn)單的查詢(xún)數(shù)據(jù)庫(kù)都是異步的。你可能會(huì)這么寫(xiě):

User.findOne({username: user.username}, function (err, doc) {
    if(!doc){ // 用戶(hù)不存在,繼續(xù)根據(jù)郵箱進(jìn)行查詢(xún)
        User.findOne({username: user.username}, function (err, doc) {
            if(doc){    // 郵箱存在返回錯(cuò)誤
                req.flash('error', '郵箱已被占用!');
                res.redirect('/register');
            }else{
                //…… 進(jìn)行注冊(cè)操作
            }
        });
    }else{  // 用戶(hù)存在,返回錯(cuò)誤
        req.flash('error', '用戶(hù)名已被占用')
        res.redirect('/register');
    }
});

已經(jīng)嵌套了兩層回調(diào),如果是檢查三個(gè)字段、四個(gè)字段、五個(gè)字段呢?后果不堪設(shè)想!
有沒(méi)有優(yōu)雅的實(shí)現(xiàn)方法呢?答案是有的!我們用到了async。

優(yōu)雅的實(shí)現(xiàn)方式

async是一個(gè)流程控制工具包,可以完美解決我們的問(wèn)題。(關(guān)于async的詳細(xì)介紹,請(qǐng)移步項(xiàng)目地址:https://github.com/caolan/async; 也可以參考這里:http://blog.csdn.net/jbboy/article/details/37667809 ,這里就不作悖述 )

很顯然,根據(jù)我們的需求,兩次的數(shù)據(jù)庫(kù)查詢(xún)判斷并沒(méi)有對(duì)順序做要求,所以我們選擇asyncparallel:并行執(zhí)行多個(gè)函數(shù),然后做統(tǒng)一的判斷處理。

async.parallel() 方法接收兩個(gè)參數(shù),一個(gè)是執(zhí)行的方法組,一個(gè)是回調(diào)。

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}
})

其中第一個(gè)參數(shù),可以是上面那種數(shù)組的形式,也可以是對(duì)象的形式:

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

實(shí)現(xiàn)方法:

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, '用戶(hù)名已被占用');
        res.redirect('/join');
        return;
    }
    if(results.email){
        req.flash(config.constant.flash.error, '郵箱已被占用');
        res.redirect('/join');
        return;
    }
});

這樣是不是簡(jiǎn)潔多了?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 點(diǎn)擊查看原文 Web SDK 開(kāi)發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 14,306評(píng)論 0 15
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,996評(píng)論 25 709
  • Node基本 node的最大特性莫過(guò)于基于事件驅(qū)動(dòng)的非阻塞I/O模型。 node通過(guò)事件驅(qū)動(dòng)的方式處理請(qǐng)求,無(wú)須為...
    AkaTBS閱讀 2,305評(píng)論 0 11
  • 1.安排“充電時(shí)刻”:每天抽出一小時(shí),持續(xù)地做一件事情。它有兩個(gè)原則:一是時(shí)間雷打不動(dòng),二是每天只安排一個(gè)充電時(shí)刻...
    濃湯閱讀 204評(píng)論 4 4
  • 登閱讀島打卡第四天 讀的什么書(shū):《象與騎象人》 閱讀有效時(shí)間:45分鐘 閱讀中遇到了什么困難:閱讀時(shí)有些段落看不進(jìn)...
    小懶肉閱讀 206評(píng)論 0 0

友情鏈接更多精彩內(nèi)容