将此绑定到回调函数

时间:2015-08-05 21:57:57

标签: javascript bind

如何使用call或apply?

将其绑定到回调函数
SKNode

在某些时候引发错误:

TypeError:this.get不是函数

这应该引用Ember Controller范围,为什么如果我先绑定bind(this)然后调用(this)会抛出错误?

2 个答案:

答案 0 :(得分:1)

你最好使用bind

function doSomething(){
    return authorize().then((function(){

       }).bind(this));
}
  

bind()函数创建一个新函数(一个绑定函数),它具有相同的函数体(ECMAScript 5术语中的内部调用属性),因为它被调用的函数(绑定函数的目标函数)具有此值绑定到bind()的第一个参数,它不能被覆盖。

MDN

编辑:你仍然犯同样的错误。 promise方法then接受一个函数引用,因此它可以在它被解决后调用它。你正在做的是执行函数并将函数的返回值传递给then方法,在本例中是另一个promise对象。

让我们分解:

beforeModel: function(params) {
  //Function to be passed down to your promise to find a Client.
  //Note that nothing gets passed down to the next step once the promise gets settled.
  var fClient = function() {
    this.findClient(params);
  };
  //We want this to be this (of beforeModel function).
  fClient = fClient.bind(this);

  //I have no idea what you are trying to do with the catch...
  var reAttachPromise = function() {
    return this.get('session').authorize().then(fClient);
  };
  //We want this to be this (of beforeModel function).
  reAttachPromise = reAttachPromise.bind(this);

  return this.get('session').authenticate().then(fClient).catch(reAttachPromise);
  //can be reduced to:
  // return reAttachPromise().catch(reAttachPromise);
}

答案 1 :(得分:0)

    }.bind(this)).catch(function(err){
      //retrieve new session
      return this.get('session').authorize().then(function(){
        this.findClient(params);
      }.call(this));
    }.bind(this)); //!!

! - 评论专栏被我改变了。 您正确绑定了success函数,但未绑定failure函数。很容易错过!