如何在JavaScript中隐含复杂的决定

上下文:

我们正在为注册组件编写逻辑。如果用户未通过身份验证,则应显示该表单。如果/当用户通过身份验证时,它应该重定向到多个位置之一。如果有未读消息,请重定向到第一条消息。如果没有未读消息,请重定向到仪表板。

我们还需要处理另一种情况。当收到新邮件时,用户可以收到一封电子邮件通知,其中包含指向登录表单的链接,其中包含特定邮件ID的查询参数。例如:/signin?new_message=42。在这种情况下,如果用户当前未通过身份验证,则应显示登录表单;如果/当用户通过身份验证时,请重定向到该特定消息。

我的问题:

我们如何以一种优雅而又可扩展的方式实现这一目标?

怀疑state machine是完成这项工作的正确工具,但我愿意接受其他方法。我强调了 extendible 一词,因为这不是代码高尔夫!我正在寻找一个现实的解决方案,该解决方案可以在将来进行适当扩展以包含其他业务逻辑。

注意:我实际上并不特别在意javascript,但是StackOverflow最佳实践强调了特异性,而JS是我使用的语言。因此,可接受的答案可以使用伪代码,只要它在概念上与javaScript兼容即可。 (不要对仅适用于Go的内容进行伪编码)

扰流板警报!这是错误的答案:

if (authed && hasUnreadMessages && !clickFromEmail) {
  redirect = `/messages/${fistUnreadMessageId}`;
}
if (authed && !hasUnreadMessages && !clickFromEmail) {
  redirect = `/dashboard`
}
if (authed && clickFromEmail) {
  redirect = `/messages/${messageIdFromQueryString}`
}
...

^嵌套条件的混乱缠结是我们要解决的问题

没有我的问题

这是一个真实的例子,但是我的问题的主要目标是学习实现复杂的决策逻辑。因此,我对完全避免这种逻辑的体系结构解决方案不感兴趣。例如:“创建不同的表单/端点以处理不同的情况”

我对依赖特定库的解决方案也不感兴趣。例如:“您应该只使用ComplexSigninlibrary.js”

产品设计或用户体验建议也遗漏了此问题的要点,例如:“直接从电子邮件通知链接到新消息将是更好的用户体验...”

dypzy2000 回答:如何在JavaScript中隐含复杂的决定

根据您的描述,确定请求是否来自电子邮件似乎没有意义(或实际上不可能)。

您需要做的是:

  1. 检查用户是否已通过身份验证
    • 如果用户通过了身份验证,请检查查询字符串并根据该查询字符串进行重定向,如果没有查询字符串,则将其重定向到仪表板(您可以为此使用三元运算符)
    • 如果用户未通过身份验证,则显示登录表单
if(authed) 
    redirect = messageIdFromQueryString ? `/messages/${messageIdFromQueryString}` : '/dashboard';
else
    redirect = '/login-form';
,

给定的上下文和示例提出了“如何根据几个布尔值的状态做出决定”的问题,对于此问题,除了连续if语句外,实际上没有必要或不希望使问题复杂化,可选使用return避免嵌套。

这已经是清晰易读的代码,并且可能是您所提出的条件的最短和最有效的实现:

var mtch="";
var matchtype=0;
function findimginpost() {
    desc= $('textarea#description').froalaEditor('html.get');
    desc=desc.split('>');
    var regexpimg1=/^<img[^>]+src=["|']{1}([^']*\.?[^']+)["|']{1}/i;
    var regexpimg2=/^<iframe[^>]+src=["|']?[^" & ^']+youtube[^" & ^']+["|']?/i;
    var regexpimg3=/https:\/\/.*soundcloud.*\/[^" | ^']+["|']?/i;
    var regexpimg=[regexpimg1,regexpimg2,regexpimg3];
    var type=['image','video','sound'];
    for(var j=0;j<type.length;j++){
        for (var i=0;i<desc.length;i++){
            desc[i]=desc[i].replace(/\"/g,"'");
            mtch=regexpimg[j].exec(desc[i]);
            if(mtch!=null){
                mtch+="";
                break;
            }
        }
        if(mtch!=null){
            mtch=mtch.split('src =');
            if(mtch.length<=1){
                mtch+="";
                mtch=mtch.split('src=');
            }
            if(j!=2)
            mtch=mtch[1];
            else
            mtch=mtch[0];
            mtch=mtch.replace(/"|'/g,"");
            matchtype=j+1
            if(j==0) {
                mtch = mtch.replace(/.*\//g,"");
            }

            if(j==1){
                mtch="https:"+mtch;
                mtch=mtch.replace(/watch\?/g,"embed/");
            }
            $('#cover_type').val(matchtype);
            $('#cover_url').val(mtch);
        }
    }
}
本文链接:https://www.f2er.com/3142603.html

大家都在问