在承诺中传递“这个”?

时间:2015-06-09 09:46:18

标签: javascript jquery ajax promise

我正在努力了解承诺。

我的网址将包含三个ID参数,例如

#org=123&num=145&denom=467

我希望使用它们来选择我页面上的三个select元素的值(每个元素都带有一个Ajax源),例如:

<select id="org"><option selected val="123">Birmingham University</option></select>
<select id="num"><option selected val="145">Maths</option></select>
<select id="denom"><option selected val="467">English</option></select>

复杂的一点是我需要为每个ID做一个Ajax请求,这样我就可以预先填充选项的名称部分以及ID。

然后,一旦完成所有三个请求,我想继续呈现页面的其余部分。

我已经完成了大部分工作,但我仍然坚持如何在this函数中获取getNumerators的值。有人可以帮忙吗?

setUp: function() { 
   // use hash to set this.globalOptions
   var _this = this;
   _this.setFormValues().then(function() { 
      this.setUpRestOfForm ...
   };
},

setFormValues: function() { 
  return _this.getOrgs()
     .then(_this.getNumerators)
     .then(_this.getDenominators)
     .then(function() {
        return true;
        }
    });
 },

getOrgs: function() { 
    return $.ajax({
        type: 'GET',
        url:'/api/orgs/?q=' + this.globalOptions.orgId,
        dataType: 'json'
    });
},

getNumerators: function(orgIds) { 
   // FAILS: Cannot set property 'orgIds' of undefined
   this.globalOptions.orgIds = orgIds;
   var url = '/api/subjects/?q=' + this.globalOptions.numId; 
    return $.ajax({
        type: 'GET',
        url: url,
        dataType: 'json'
    });
}

我也很感激地收到关于我这样做的任何其他建议。

1 个答案:

答案 0 :(得分:3)

您可以使用Funtion.bind()/ $.proxy()来传递自定义执行上下文

setFormValues: function() { 
  return _this.getOrgs()
     .then(_this.getNumerators.bind(_this)) //using bind() - supported in IE9+
     .then($.proxy(_this.getDenominators, _this)) //using $.proxy()
     .then(function() {
        return true;
        }
    });
 }

或者您可以使用ajax中的上下文选项传递自定义上下文

getOrgs: function() { 
    return $.ajax({
        type: 'GET',
        url:'/api/orgs/?q=' + this.globalOptions.orgId,
        dataType: 'json',
        context: this
    });
},