【问题标题】:Global variable not working inside switch - javascript全局变量在开关内不起作用 - javascript
【发布时间】:2018-09-27 07:21:51
【问题描述】:
 let visitor;
 const role = req.user.profile;

 // role will be either Admin or Manager

 switch (role) {
   case 'Admin':
     if (req.body.verificationMode === 'online') {
       visitor = {
         name: req.body.name,
         mode: 'online',
       };
     } else {
       visitor = {
         name: req.body.name,
         mode: 'offline'
       };
     }
     break;


   case 'Manager':
     Staff.findOne({
       where: {
         loginId: req.user.id,
       },
     }).then((staffData) => {
       if (req.body.verificationMode === 'online') {
         visitor = {
           name: req.body.name,
           mode: 'online',
         };
       } else {
         visitor = {
           name: req.body.name,
           mode: 'offline',
         };
       }
     });
     break;

 }
 console.log('visitor >>> >> >> >> >>> >>>> >>>> >>>> >>> >>>> >>>', visitor);

如果我以 Admin 角色登录,则访问者的控制台具有正确的数据,但如果以 Manager 角色登录,则访问者的控制台变为 undefined .

为什么会这样?我使用的是 ES6,所以我不使用 var。

【问题讨论】:

  • 如果Managerconsole.log 之后执行,您有异步代码。这就是为什么在这种情况下访客是undefined
  • @AagamJain 是对的,您的 console.log 甚至在 Staff.findOne 异步语句设置访问者变量之前就打印出来了。
  • @MohamedSameer 您代码中的.then() 在您的console.log() 之后执行。所以访客还没有设置。
  • @Frost no、constlet 甚至 ES6 对异步代码绝对没有影响。

标签: javascript variables switch-statement global-variables


【解决方案1】:

对于在 console.log 之后执行的 Manager,您有异步代码。这就是为什么在这种情况下访问者是未定义的。

使用这个。

 let visitor;
 const role = req.user.profile;
 let callback = function(){
     console.log('visitor >>> >> >> >> >>> >>>> >>>> >>>> >>> >>>> >>>', visitor); 
 }
 // role will be either Admin or Manager



 switch (role) {
   case 'Admin':
     if (req.body.verificationMode === 'online') {
       visitor = {
         name: req.body.name,
         mode: 'online',
       };
     } else {
       visitor = {
         name: req.body.name,
         mode: 'offline'
       };
     }
     callback();
     break;


   case 'Manager':
     Staff.findOne({
       where: {
         loginId: req.user.id,
       },
     }).then((staffData) => {
       if (req.body.verificationMode === 'online') {
         visitor = {
           name: req.body.name,
           mode: 'online',
         };
       } else {
         visitor = {
           name: req.body.name,
           mode: 'offline',
         };
       }
       callback();
     });
     break;

 }

console.log 移动到一个函数中,该函数在visitor 值初始化后调用。

【讨论】:

  • 感谢它现在工作,使用回调是否好?还是异步等待或承诺?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 2016-12-30
相关资源
最近更新 更多