2017-10-10 73 views
1

当我尝试调用扩展功能时,出现'超级'关键字意外。'超级'关键字意外在这里

handleLogin(data, client) { 
    logger.write('Login initiated'); 

    var xml = libxmljs.parseXml(data); 
    var nick = (xml.get('//nick')).text(); 
    var pass = (xml.get('//pword')).text(); 

    super.database.getPlayer(nick, function(err, player) { 
     if(player) { 
      super.database.updateColumn(player.id, 'loginKey', loginKey); 
     } 
    }); 
} 

错误发生在这条线:

  super.database.updateColumn(player.id, 'loginKey', loginKey); 

我似乎无法理解为什么。

+0

这是因为超级变量超出了handleLogin函数范围的可访问性。你在哪里定义'super'变量? – dhilt

+2

super是类的保留字:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Keywords – soywod

+0

这是一个类内的方法。我在另一个类的构造函数中定义它,这个类在这个方法的类中被扩展.. – Jack

回答

1

您可以使用箭头功能回调保护范围为特定的上下文关键字super

const wait = (ms) => new Promise(resolve => { 
 
    setTimeout(resolve, ms) 
 
}) 
 

 
// dumb example 
 
class SlowArray extends Array { 
 
    push (value) { 
 
    return wait(Math.random() * 100 + 100) 
 
     .then(() => { 
 
     // arrow function with super 
 
     return super.push(value) 
 
     }) 
 
    } 
 
} 
 

 
var array = new SlowArray() 
 

 
array.push(5).then(length => { 
 
    console.log('done:', length, `[${array}]`) 
 
}) 
 

 
console.log('waiting...', length, `[${array}]`)

所以,在你的榜样,这将是:

super.database.getPlayer(nick, (err, player) => { 
    if (player) { 
     super.database.updateColumn(player.id, 'loginKey', loginKey); 
    } 
});