我正在努力了解承诺。
我的网址将包含三个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'
});
}
我也很感激地收到关于我这样做的任何其他建议。
答案 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
});
},