2013-11-21 96 views
1

我该如何等到两个函数结束时,并且只有在为它们调用回调才能继续执行脚本之后。函数的并行执行并等待它们的完成

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

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

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

回答

1

创建两个延期对象和回调中解决这些问题。然后你就可以在两个deferreds等待与$.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."); 
}); 
+0

+1,比我的要干净得多。不知道它是否“更快”。 –

+1

@ Karl-AndréGagnon:我不认为这种差别是可以衡量的,但绝对而言,它肯定会“较慢”。这里的主要吸引力在于,你可以继续链接或集成任何延迟(主或任一子)到任何其他异步管道。 – Jon

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

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

相关问题