使用javascript getters是将函数调用绑定到对象定义的一种很酷的方法。我以前曾多次使用它,但在最近的一个问题中,我想用它来绑定一个函数,该函数返回一个jQuery promise对象,该对象在$ .when ... $。then chain中使用。
似乎使用吸气剂并不像我期望的那样工作;具体来说,$ .then()在使用getter返回的函数定义时,不会等待绑定函数的promise对象被解析。但是,如果没有使用getter,我只是直接调用函数,事情按预期工作。
知道为什么会这样吗?
示例:
var myObj = {
asynch1: {
a: 200,
b: 300,
get runAsynch3() {return function() {
myCustomAsynchCode3(this.a, this.b);
}
},
},
};
function myCustomAsynchCode1() {
var df = $.Deferred();
// do stuff that, when done, calls
// df.resolve();
return df.promise();
}
function myCustomAsynchCode2() {
var df = $.Deferred();
// do stuff that, when done, calls
// df.resolve();
return df.promise();
}
function myCustomAsynchCode3(val1, val2) {
var df = $.Deferred();
// do stuff that, when done, calls
// df.resolve();
return df.promise();
}
如果我打电话,如
var that = this;
$.when(myCustomAsynchCode1()).
then(function() {
return that.myCustomAsynchCode2();
).
then(function() {
return that.myObj.runAsynch3();
});
runAsynch3()在myCustomAsynchCode2()解析其promise对象之前执行。
但是,如果我这样打电话
var that = this;
$.when(myCustomAsynchCode1()).
then(function() {
return that.myCustomAsynchCode2();
).
then(function() {
return myCustomAsynchCode3(that.myObj.a, that.myObj.b);
});
一切都按预期工作 - 承诺对象在不相互踩踏的情况下得到解决。