2017-08-17 53 views
0

我正在使用nodejs 8和类功能,但发现此绑定是意外的。范围中的回调函数setTimeout()in nodejs 8

在我的下面的代码中,应该可以在由setTimeout创建的闭包中访问xxx变量,但它不是。为什么?

class Wechat { 

    constructor(option) { 
    this.option = option 


    } 

    verifySource() { 
    console.log('verify source...') 
    } 

    async setMenu() { 
    console.log('setMenu...') 
    let thisObject = this 
    let nick = 'nick xu' 
    var xxxx = 'xxxx nick xu' 
    let accessToken = await this.getAccessToken() 
    console.log('accessToken:', accessToken) 
    setTimeout(function() { 
     // let abc = await thisObject.getAccessToken() 
     // no access to xxxx and nick variables 
     // this point to Timeout object 
     console.log('2nd time token:', '000000') 
    }, 5000) 
    return Promise.resolve(33) 
    } 




    async getAccessToken() { 
    /* 
    this.access_token = 'kkkkkk' 
    this.expires_in = 7200 
    this.access_token_receive_time = 123456 
    */ 
    const timeBuffer = 60 * 10 * 1000 // 10 min 
    if (this.access_token && this.expires_in && this.access_token_receive_time) { 
     // if any of the above data exist 
     // check expire 
     let currentTime = new Date().getTime() 
     if (currentTime - this.access_token_receive_time > timeBuffer + this.expires_in * 1000) { 
     // token is valid 

     return this.access_token 
     } 
    } 

    let result = await rp.get(config.baseUrl + '/token?' + 
     'grant_type=client_credential&appid=' + config.appID + 
     '&secret=' + config.appSecret) 
    let resultJson = JSON.parse(result) 
    console.log('result of token request:', result) 
    this.access_token = resultJson.access_token 
    this.expires_in = resultJson.expires_in 
    this.access_token_receive_time = new Date().getTime() 
    return this.access_token 

    } 

    static distance() { 
    console.log('static method distance') 
    } 
} 

当在调试里面的setTimeout回调。 enter image description here

此指向超时。到底是怎么回事? enter image description here

检查观察者,XXXX和尼克都无法使用...... enter image description here

+1

你似乎在这里问两个不相关的事情。在控制台中,您正在检查'this',但'xxxx'和'nick'变量与'this'无关,它们是'setMenu()'中的局部变量。 – nnnnnn

+0

在setTimeout回调中,xxxx和nick变量应该可用,因为它们在外部闭包中。它是否正确? –

+1

是的。你是如何尝试使用它们的?显示的代码中没有任何内容试图使用它们。 – nnnnnn

回答

-1

如果你只是想绑定正确的“这

setTimeout.call(this, function(){}) //or put whatever scope you want for this

,如果你想在settimeout中添加参数,你可以使用这个

let thisObject = this 
 
    let nick = 'nick xu' 
 
    var xxxx = 'xxxx nick xu' 
 
    
 
    setTimeout (function (thisObject,nick,xxxx) {},1000,thisObject,nick,xxxx);

+0

这就是* not *如何在回调中绑定'this'的值,即为'setTimeout()'本身设置'this'的值(这将导致错误,除非第一个参数为'.call )'是全局对象)。 – nnnnnn