2016-12-01 6 views
0

Я пытаюсь передать переменную объекта на обратный вызовJavascript функция обратного вызова переменная сфера

var sql = require('mssql'); 
var asset_update = function (connection, addr) { 
    this.connection = connection; 
    this.addr = addr; 
    this.addr_long = parseInt(addr, 16); 
} 

asset_update.prototype.getFromMac = function() { 
    var ps = new sql.PreparedStatement(this.connection); 
    ps.input('addr', sql.Binary); 
    ps.prepare('SELECT asset_id FROM asset_addr WHERE addr = @addr', function (err) { 
     ps.execute({ addr: this.addr_long }, function (err, recordset) { 
      ps.unprepare(); 
      console.log(recordset.length); 
      console.log(this.addr_long); 
     }) 
    }); 
} 

Как я могу передать this.addr_long в ps.execute() обратного вызова?

ответ

0

Вы можете использовать функцию стрелки, чтобы сохранить это:

ps.prepare('SELECT asset_id FROM asset_addr WHERE addr = @addr', (err) => { 
    ps.execute({ mac: this.addr_long }, function (err, recordset) { //this has been preserved 
     ps.unprepare(); 
     console.log(recordset.length); 
     console.log(this.addr_long); 
    }) 
}); 

Check out this doc for the ES5 alternatives, которые вы не должны использовать больше.

Популярным было бы переименовать this в that или self. Но это уже устарело. Это будет выглядеть так:

var self = this; 
ps.prepare('SELECT asset_id FROM asset_addr WHERE addr = @addr', function (err) { 
     ps.execute({ mac: self.addr_long }, function (err, recordset) { 
      ps.unprepare(); 
      console.log(recordset.length); 
      console.log(that.addr_long); 
     }) 
    }); 

Как вы новичок в узел/JS, я предлагаю вам прочитать следующие ресурсы:

What does "this" mean?

Callbacks overview and tricks

+0

Спасибо .. Я собираюсь использовать лямбда, как мне это уже знакомо. – Magician

-1
asset_update.prototype.getFromMac = function() { 
    var that = this; 
    var ps = new sql.PreparedStatement(this.connection); 
    ps.input('addr', sql.Binary); 
    ps.prepare('SELECT asset_id FROM asset_addr WHERE addr = @addr', function (err) { 
     ps.execute({ mac: that.addr_long }, function (err, recordset) { 
      ps.unprepare(); 
      console.log(recordset.length); 
      console.log(that.addr_long); 
     }) 
    }); 
} 
Смежные вопросы