NodeJS / Firebase承诺的范围

时间:2016-12-15 00:55:07

标签: node.js firebase firebase-authentication

我正在尝试开发连接到Firebase的NodeJS应用。我可以成功连接,但我无法确定如何在then调用中管理范围。

我正在使用NodeJS 6.9.2

我的测试实现如下:

const EventEmitter = require('events');
const fb = require('firebase')

class FireGateway extends EventEmitter {

constructor() {
    super();
    if ( this.instance ) {
      return this.instance;
    }
    // INIT
    var fbConfig = {
        apiKey: "xxxxx",
        authDomain: "xxxxx.firebaseapp.com",
        databaseURL: "https://xxxxx.firebaseio.com/"
        };
    fb.initializeApp(fbConfig)
    this.instance = this;
    this.testvar = "aaa";   
}

login() {
    fb.auth().signInWithEmailAndPassword ("email", "pwd")
    .catch(function(error) {
        // Handle Errors here.
    }).then( function(onresolve, onreject) {
        if (onresolve) {            
            console.log(this.testvar);
            // "Cannot read property 'testvar' of undefined"
           this.emit('loggedin');
           // error as well
           }
    })
}

}


module.exports = FireGateway;

------
...
var FireGateway = require('./app/fireGateway');
this.fireGW = new FireGateway();
this.fireGW.login();
....

我知道如何管理它?

1 个答案:

答案 0 :(得分:1)

传递给then的回调是从另一个上下文异步调用的,因此terms并不对应于实例化的对象。

使用ES6 this可以保留对象上下文,因为箭头函数不会创建自己的arrow functions上下文。

顺便说一句,您在this方法中使用的语法不正确,then接受两个回调,每个回调一个参数。检查语法here。 我认为then之前的catch也没有必要,最后把它放在最后会更有意义。

这将是这样的:

then

另一方面,似乎login() { fb.auth().signInWithEmailAndPassword("email", "pwd") .then( (onResolve) => { console.log(this.testvar); this.emit('loggedin'); }, (onReject) = > { // error handling goes here }); } 方法正在执行异步操作,因此您可能希望等待它在代码中完成。我会让login方法返回一个Promise,所以你可以在外面等待它:

login