2013-11-21 127 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(){} 

這比延遲方法的開銷少,但不是很乾淨。

相關問題