等待异步加载的类完成(没有回调)

时间:2011-07-28 22:18:18

标签: javascript jquery asynchronous

在调用类之前等待异步加载的类的正确方法是什么?

注意:我处于一个复杂的情况,我无法使用异步加载回调。

这是最好的方法吗?

callClassFunction : function () {
  try {
    waitingOnThisClass.someFunction();
  } catch (e) {
    setTimeout("superClass.callClassFunction()",250);
  }
}

* jQuery的方式值得一提,如果有的话......

2 个答案:

答案 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并且只是重复重新运行该函数?)