一道 关于异步回调的面试题,求解

  1. 有一个认证过程auth(username,password,cb)包括以下步骤,请用js语言实现此方法:
  • 先判断是否本系统用户authLocal(username, cb)
  • 如果是本系统用户, 接着判断密码authPassword(password, cb)
  • 如果不是本地用户, 分别去验证是否是 QQ 用户或 Weibo 用户; authQQ(username, cb); authWeibo(username, cb);
  • 如果是QQ或Weibo用户, 则判断是否有权限登陆本系统,authPriviage(username,cb);
以上全部为异步操作, cb 统一为 function(err, result) 形式。

这个 代码 具体怎么实现呢?

阅读 3k
4 个回答

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


if(authLocal(username, cb)){

authPassword(password, cb)

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

authPriviage(username,cb)

}else{

console.log('验证不通过')

}
说实话 我没看出来这是个异步的流程

都是异步回调判断的问题,如果全部用if...else...显得有点嵌套有点深,你可以先回答用if...else

然后再回答用es6的promise形式 或者用 async...await形式来表达、

出这个题目的目的,是为了考回调,写出了答案,面试官自然就会问这么写是不是不好,怎么改进,然后可以说用 Promise,然后肯定要写 Promise 版本,这个时候就差不多了。如果面试官问有没有更好的解决办法,就可以说用 Async。

authLocal(username, function (err, res) {
    if (err) {
        alert('不是本系统用户');
        authQQ(username, function (err, res) {
            if (err) {
                alert('不是 qq 用户');
                return;
            }
            authPriviage(username, function (err, res) {
                if (err) {
                    alert('是 qq 用户但没有权限登录');
                    return;
                }
                alert('有权限的 qq 用户');
            });
        });
        authWeibo(username, function (err, res) {
            if (err) {
                alert('不是 weibo 用户');
                return;
            }
            authPriviage(username, function (err, res) {
                if (err) {
                    alert('是 weibo 用户但没有权限');
                    return;
                }
                alert('有权限的 weibo 用户');
            });
        });
        return;
    }
    authPassword(password, function (err, res) {
        if (err) {
            alert('密码错误');
            return;
        }
        alert('登录成功');
    });
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题