0

我有一个成功登录用户的功能。

_login: function() {
   var email = this.$.emailvalue.value;
   var password = this.$.passwordvalue.value;

   return this.$.authenticate.signInWithEmailAndPassword(email, password).then(function() {
      // Sign-in successful.
      //this._animateView(); **returns undefined**
    }, function(error) {
      // An error happened.
    //     // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message; 
        console.log(errorMessage);
        // this._animateErrorView(); **returns undefined**
    });

  },

我想要的是this._animateView();在用户成功登录并且this._animateErrorView()出现错误时调用一个函数。

如果我尝试这样做它返回未定义..我该如何解决这个问题

4

2 回答 2

1

回调函数中的含义this不同。

您可以通过多种方式解决此问题,但这里有两种。

在另一个变量中捕获 this 的值

您无法阻止this获取新值,因为这就是 JavaScript 闭包的工作方式。但是你可以做的是用你需要的值定义一个不同的值。变量的惯用名称是self,尽管我个人更喜欢更具描述性的名称:

_login: function() {
   var email = this.$.emailvalue.value;
   var password = this.$.passwordvalue.value;
   var self = this;    
   return this.$.authenticate.signInWithEmailAndPassword(email, password).then(function() {
        self._animateView();
    }, function(error) {
        var errorCode = error.code;
        var errorMessage = error.message; 
        console.log(errorMessage);
        self._animateErrorView();
    });
  }

使用粗箭头函数

ES6 定义了一种使用所谓的粗箭头 ( =>) 声明函数的新方法。除了稍微少一些代码之外,这些确保thislambda/callback 中的值保持不变。所以

_login: function() {
   var email = this.$.emailvalue.value;
   var password = this.$.passwordvalue.value;
   return this.$.authenticate.signInWithEmailAndPassword(email, password).then(() => {
        this._animateView();
    }, (error) => {
        var errorCode = error.code;
        var errorMessage = error.message; 
        console.log(errorMessage);
        this._animateErrorView();
    });
  }
于 2017-01-25T11:16:21.850 回答
1

除了@Frank van Puffelen 的回答之外,聚合物开发团队还使用了另一种方法:

_login: function() {
   var email = this.$.emailvalue.value;
   var password = this.$.passwordvalue.value;

   return this.$.authenticate.signInWithEmailAndPassword(email, password).then(function() {
      // Sign-in successful.
      //this._animateView(); **returns undefined**
    }.bind(this), function(error) {
      // An error happened.
    //     // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message; 
        console.log(errorMessage);
        // this._animateErrorView(); **returns undefined**
    }.bind(this));

  },

所以基本上你.bind(this)在最后添加到每个回调。

于 2017-01-26T19:38:48.470 回答