在调用类之前等待异步加载的类的正确方法是什么?
注意:我处于一个复杂的情况,我无法使用异步加载回调。
这是最好的方法吗?
callClassFunction : function () {
try {
waitingOnThisClass.someFunction();
} catch (e) {
setTimeout("superClass.callClassFunction()",250);
}
}
* jQuery的方式值得一提,如果有的话......
答案 0 :(得分:4)
好。如果允许jQuery -jquery promise接口和jQuery.Deferred就是这样:
// Create a Deferred and return its Promise
function asyncEvent(){
var dfd = new jQuery.Deferred();
setTimeout(function(){
dfd.resolve("hurray");
}, Math.floor(Math.random()*1500));
setTimeout(function(){
dfd.reject("sorry");
}, Math.floor(Math.random()*1500));
return dfd.promise();
}
// Attach a done and fail handler for the asyncEvent
$.when( asyncEvent() ).then(
function(status){
alert( status+', things are going well' );
},
function(status){
alert( status+', you fail this time' );
}
);
另一个例子;
function doAjax(){
return $.get('foo.htm');
}
function doMoreAjax(){
return $.get('bar.htm');
}
$.when( doAjax(), doMoreAjax() )
.then(function(){
console.log( 'I fire once BOTH ajax requests have completed!' );
})
.fail(function(){
console.log( 'I fire if one or more requests failed.' );
});
答案 1 :(得分:2)
我要做的一个改变是摆脱try / catch,而是测试函数是否存在(还):
callClassFunction : function () {
if (waitingOnThisClass && waitingOnThisClass.someFunction)
waitingOnThisClass.someFunction();
else
setTimeout(superClass.callClassFunction,250);
}
请注意,您无需明确说出
if (waitingOnThisClass != undefined
&& typeof waitingOnThisClass.someFunction === "function")
因为如果它们作为对象/函数存在,它们将被评估为“真实”。
(如果你确实使用了try / catch并且函数已经加载但是它有一些错误,它不会触发catch并且只是重复重新运行该函数?)