在Test里面有两个方法,getInfo 与pushSeller,当我在pushSeller中调用getInfo时是为定义错误。请问是作用域得问题吗?谢谢!
function Test() {
this.style = new Xinge.Style(4, 1, 1, 1, 0);
this.getInfo = function (os, flag) {
this.accessId = Number(process.env['XINGE_' + flag +'_' + os + '_ACCESS_ID']);
this.secretKey = process.env['XINGE_' + flag + '_' + os + '_SECRET_KEY'];
this.XingeApp = new Xinge.XingeApp(this.accessId, this.secretKey);
}
this.pushSeller = function (seller_id, title, content) {
console.log(this.getInfo); //在这我可用访问到getInfo
db.query(
"SELECT * FROM seller_admin WHERE seller_id=?", [seller_id],
function (err, seller_admin) {
if (err) {
return console.log(err);
}
if (seller_admin.length) {
for (var i = 0; i < seller_admin.length; i++) {
(function (i) {
db.query(
"SELECT os, pushtoken FROM user WHERE uid =?", [seller_admin[i].uid],
function (err, user) {
if (err) {
return console.log(err);
}
if (user[0].pushtoken) {
if (user[0].os == 'android') {
console.log(user);
this.getInfo('ANDROID', 'SHOP'); //在这里我访问不到getInfo
this.android(user[0].pushtoken, title, content)
}
}
}
);
})(i);
}
}
}
);
}
}
45 回复
@ngot 我console.log(this),得道德是下面得东西。this变成了db.query?
{ domain: null,
_events:
{ error: [Function],
packet: [Function],
end: [Function],
timeout: [Function],
'start-tls': [Function] },
_maxListeners: 10,
_callback: [Function],
_callSite: null,
_ended: true,
_timeout: undefined,
_idleNext: null,
_idlePrev: null,
_idleStart: null,
_idleTimeout: undefined,
_repeat: null,
sql: 'SELECT os, pushtoken FROM user WHERE uid =15',
values: [ 15 ],
typeCast: true,
nestTables: false,
_resultSet: null,
_results: [ [ [Object] ] ],
_fields: [ [ [Object], [Object] ] ],
_index: 1,
_loadError: null,
_connection:
{ domain: null,
_events: { error: [Function] },
_maxListeners: 10,
config:
{ host: 'localhost',
port: 3306,
localAddress: undefined,
socketPath: undefined,
user: 'root',
password: undefined,
database: 'mykar_product',
connectTimeout: 10000,
insecureAuth: false,
supportBigNumbers: false,
bigNumberStrings: false,
dateStrings: false,
debug: undefined,
trace: true,
stringifyObjects: false,
timezone: 'local',
flags: '',
queryFormat: undefined,
pool: undefined,
ssl: false,
multipleStatements: false,
typeCast: true,
maxPacketSize: 0,
charsetNumber: 33,
clientFlags: 193487,
protocol41: true },
_socket:
{ _connecting: false,
_handle: [Object],
_readableState: [Object],
readable: true,
domain: null,
_events: [Object],
_maxListeners: 10,
_writableState: [Object],
writable: true,
allowHalfOpen: false,
onend: null,
destroyed: false,
bytesRead: 1344,
_bytesDispatched: 253,
_pendingData: null,
_pendingEncoding: '',
pipe: [Function],
addListener: [Function],
on: [Function],
pause: [Function],
resume: [Function],
read: [Function],
_consuming: true,
_idleTimeout: -1,
_idleNext: null,
_idlePrev: null,
_idleStart: 1407894192122 },
_protocol:
{ domain: null,
_events: [Object],
_maxListeners: 10,
readable: true,
writable: true,
_config: [Object],
_connection: [Circular],
_callback: null,
_fatalError: null,
_quitSequence: null,
_handshakeSequence: [Object],
_handshaked: true,
_ended: false,
_destroyed: false,
_queue: [Object],
_handshakeInitializationPacket: [Object],
_parser: [Object] },
_connectCalled: true,
state: 'authenticated',
threadId: 151 } }
@ngot 我去掉对象Test里面得this.getInfo方法,在pushSeller里面定义一个。
function getInfo (os, flag) {
this.accessId = Number(process.env['XINGE_' + flag +'_' + os + '_ACCESS_ID']);
this.secretKey = process.env['XINGE_' + flag + '_' + os + '_SECRET_KEY'];
this.XingeApp = new Xinge.XingeApp(this.accessId, this.secretKey);
}
然后去掉下面得this.getInfo,改为getInfo('ANDROID’, ‘SHOP’);可以访问getInfo 了。
@ngot 在Test里面这样定义getInfo? 然后在Test外面定义getInfo?
Test(){
this.getInfo = getInfo;
}
function getInfo(){
...
}
@youqingkui 没有很复杂,很简单的
function test1(){
var self = this;
self.getInfo = function(){
return "hello";
}
function test2(){
self.getInfo();
}
}
@ngot 我这样字修改了一下,Test的两个方法再pushSeller付给,但是执行到getInfo2的时候,环境不是Test的,而是node的执行环境。
this.pushSeller = function (seller_id, title, content) {
var getInfo2 = this.getInfo;
var android2 = this.android;
db.query(
"SELECT * FROM seller_admin WHERE seller_id=?", [seller_id],
function (err, seller_admin) {
if (err) {
return console.log(err);
}
if (seller_admin.length) {
for (var i = 0; i < seller_admin.length; i++) {
(function (i) {
db.query(
"SELECT os, pushtoken FROM user WHERE uid =?", [seller_admin[i].uid],
function (err, user) {
if (err) {
return console.log(err);
}
if (user[0].pushtoken) {
if (user[0].os == 'android') {
console.log(user);
getInfo2('ANDROID', 'SHOP');
android2(user[0].pushtoken, title, content)
}
}
}
);
})(i);
}
}
}
);
}
function Test() {
var self = this;
self.style = new Xinge.Style(4, 1, 1, 1, 0);
self.getInfo = function(os, flag) {
self.accessId = Number(process.env['XINGE_' + flag + '_' + os + '_ACCESS_ID']);
self.secretKey = process.env['XINGE_' + flag + '_' + os + '_SECRET_KEY'];
self.XingeApp = new Xinge.XingeApp(self.accessId, self.secretKey);
};
self.pushSeller = function(seller_id, title, content) {
db.query(
"SELECT * FROM seller_admin WHERE seller_id=?", [seller_id],
function(err, seller_admin) {
if (err) {
return console.log(err);
}
if (seller_admin.length) {
for (var i = 0; i < seller_admin.length; i++) {
(function(i) {
db.query(
"SELECT os, pushtoken FROM user WHERE uid =?", [seller_admin[i].uid],
function(err, user) {
if (err) {
return console.log(err);
}
if (user[0].pushtoken) {
if (user[0].os == 'android') {
console.log(user);
self.getInfo.call(self, 'ANDROID', 'SHOP');
self.android.call(self, user[0].pushtoken, title, content)
}
}
}
);
})(i);
}
}
}
);
}
}
@youqingkui 或者这样
this.pushSeller = function(seller_id, title, content) {
var getInfo2 = this.getInfo.bind(this);
var android2 = this.android.bind(this);
db.query(
"SELECT * FROM seller_admin WHERE seller_id=?", [seller_id],
function(err, seller_admin) {
if (err) {
return console.log(err);
}
if (seller_admin.length) {
for (var i = 0; i < seller_admin.length; i++) {
(function(i) {
db.query(
"SELECT os, pushtoken FROM user WHERE uid =?", [seller_admin[i].uid],
function(err, user) {
if (err) {
return console.log(err);
}
if (user[0].pushtoken) {
if (user[0].os == 'android') {
console.log(user);
getInfo2('ANDROID', 'SHOP');
android2(user[0].pushtoken, title, content)
}
}
}
);
})(i);
}
}
}
);
}