2017-10-10 67 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); 
    } 
});