Javascript 并行执行函数并等待其完成

Javascript 并行执行函数并等待其完成,javascript,jquery,asynchronous,callback,deferred,Javascript,Jquery,Asynchronous,Callback,Deferred,我怎样才能等到这两个函数结束,并且只有在为它们调用回调后才能继续脚本 我注意到jQuery deferred.then(),但我不知道如何在我的案例中使用它 GoogleDriveModule.checkAuth(function(authResult) { if (authResult) { return parts_count += 1; } }); DropboxModule.isAuthenticated(function(authResult) { if (aut

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

我注意到jQuery deferred.then(),但我不知道如何在我的案例中使用它

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

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

创建两个延迟对象并在回调中解析它们。然后,您可以通过以下方式等待两个延期:


创建两个延迟对象并在回调中解析它们。然后,您可以通过以下方式等待两个延期:


您可以使用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个布尔值并签入回调函数(如果它们已准备就绪):

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
    }
}

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

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(){}

与延迟方法相比,该方法的开销更小,但没有那么干净。

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

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(){}

与延迟方法相比,这种方法的开销更小,但没有那么干净。

@Karl AndréGagnon:我认为这种差异是无法衡量的,但从绝对意义上讲,它肯定会“更慢”。这里的主要吸引力在于,您可以继续将任何延迟项(主项或子项)链接或集成到任何其他异步管道中。@Karl AndréGagnon:我不认为这种差异是可以测量的,但从绝对意义上讲,它肯定会“更慢”。这里的主要吸引力在于,您可以继续将任何延迟(主管道或子管道)链接或集成到任何其他异步管道中。