我正在尝试开发连接到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();
....
我知道如何管理它?
答案 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