鍍金池/ 問答/HTML/ 一道 關(guān)于異步回調(diào)的面試題,求解

一道 關(guān)于異步回調(diào)的面試題,求解

  1. 有一個認(rèn)證過程auth(username,password,cb)包括以下步驟,請用js語言實(shí)現(xiàn)此方法:
  • 先判斷是否本系統(tǒng)用戶authLocal(username, cb)
  • 如果是本系統(tǒng)用戶, 接著判斷密碼authPassword(password, cb)
  • 如果不是本地用戶, 分別去驗(yàn)證是否是 QQ 用戶或 Weibo 用戶; authQQ(username, cb); authWeibo(username, cb);
  • 如果是QQ或Weibo用戶, 則判斷是否有權(quán)限登陸本系統(tǒng),authPriviage(username,cb);
以上全部為異步操作, cb 統(tǒng)一為 function(err, result) 形式。

這個 代碼 具體怎么實(shí)現(xiàn)呢?

回答
編輯回答
小曖昧

if(authLocal(username, cb)){

authPassword(password, cb)

}else if(authQQ(username, cb) || authWeibo(username, cb)){

authPriviage(username,cb)

}else{

console.log('驗(yàn)證不通過')

}
說實(shí)話 我沒看出來這是個異步的流程

2017年11月21日 10:35
編輯回答
嘟尛嘴

使用es6 (webpack + babel)

import pify from 'pify'
const aLocal = pify(authLocal)
const aLocalPassword = pify(authPassword)
const aQQ = pify(authQQ)
const aWeibo = pify(authWeibo)
const aPriviage = pify(authPriviage)

function auth(username,password, cb){
    try{
        let res
        let isLocal = await aLocal()
        if(isLocal){
          res =  await aLocalPassword(password)
          cb(null,res)
        } else {
            let isQQ = await aQQ(username);
            let isWeibo = await aWeibo(username);
            if(isQQ || isWeibo){
                res = await aPriviage(username)
                cb(null,res)
            } else {
                cb(null, {
                    //...這里是沒有找到的提示
                })
            }
        }
    }catch(e){
        cb(e)
    }
}


2017年6月21日 15:52
編輯回答
維她命

出這個題目的目的,是為了考回調(diào),寫出了答案,面試官自然就會問這么寫是不是不好,怎么改進(jìn),然后可以說用 Promise,然后肯定要寫 Promise 版本,這個時(shí)候就差不多了。如果面試官問有沒有更好的解決辦法,就可以說用 Async。

authLocal(username, function (err, res) {
    if (err) {
        alert('不是本系統(tǒng)用戶');
        authQQ(username, function (err, res) {
            if (err) {
                alert('不是 qq 用戶');
                return;
            }
            authPriviage(username, function (err, res) {
                if (err) {
                    alert('是 qq 用戶但沒有權(quán)限登錄');
                    return;
                }
                alert('有權(quán)限的 qq 用戶');
            });
        });
        authWeibo(username, function (err, res) {
            if (err) {
                alert('不是 weibo 用戶');
                return;
            }
            authPriviage(username, function (err, res) {
                if (err) {
                    alert('是 weibo 用戶但沒有權(quán)限');
                    return;
                }
                alert('有權(quán)限的 weibo 用戶');
            });
        });
        return;
    }
    authPassword(password, function (err, res) {
        if (err) {
            alert('密碼錯誤');
            return;
        }
        alert('登錄成功');
    });
});
2017年3月15日 00:58
編輯回答
囍槑

都是異步回調(diào)判斷的問題,如果全部用if...else...顯得有點(diǎn)嵌套有點(diǎn)深,你可以先回答用if...else

然后再回答用es6的promise形式 或者用 async...await形式來表達(dá)、

2018年4月6日 07:21