并行执行函数并等待它们完成

时间:2013-11-21 21:51:32

标签: javascript jquery asynchronous callback deferred

我怎样才能等到两个函数结束,并且只有在为它们调用回调之后才能继续执行脚本。

我注意了jQuery deferred.then(),但我不明白如何在我的情况下使用它

GoogleDriveModule.checkAuth(function(authResult) {
  if (authResult) {
    return parts_count += 1;
  }
});

DropboxModule.isAuthenticated(function(authResult) {
  if (authResult) {
     return parts_count += 1;
  }
});

3 个答案:

答案 0 :(得分:1)

创建两个延迟对象并在回调中解析它们。然后,您可以使用$.when等待两个延迟:

var googleDone = $.Deferred(),
    dropboxDone = $.Deferred();

GoogleDriveModule.checkAuth(function(authResult) {
  googleDone.resolve();
  if (authResult) {
    return parts_count += 1;
  }
});

DropboxModule.isAuthenticated(function(authResult) {
  dropboxDone.resolve();
  if (authResult) {
     return parts_count += 1;
  }
});

$.when(googleDone, dropboxDone).then(function() {
    alert("Both authentication checks completed.");
});

答案 1 :(得分:0)

你可以有2个布尔值并检查回调函数是否准备就绪:

var gDriveREADY = false, dBoxREADY = false;
GoogleDriveModule.checkAuth(function(authResult) {
    if (authResult) {
        return parts_count += 1;
    }
    gDriveREADY = true;
    doSomething()
});

DropboxModule.isAuthenticated(function(authResult) {
    if (authResult) {
        return parts_count += 1;
    }
    dBoxREADY = true;
    doSomething();
});

function doSomething(){
    if(dBoxREADY && gDriveREADY){
        //Your code
    }
}

答案 2 :(得分:0)

在回调中,您可以切换另一个函数检查的简单标志:

var driveDone = 0
  , dropDone = 0
  ;
GoogleDriveModule.checkAuth(function(authResult) {
  driveDone = 1;
  if (authResult) {
    parts_count += 1;
  }
  if(dropDone){
   bothDone();
  }
});

DropboxModule.isAuthenticated(function(authResult) {
  dropDone = 1;
  if (authResult) {
     parts_count += 1;
  }
  if(driveDone){
   bothDone();
  }
});
function bothDone(){}

这比延迟方法的开销更少,但不是那么干净。

相关问题