2016-11-20 183 views
0

jQuery並沒有等待它在調用之前完成該函數。jQuery完成後不等待它完成

$.when(saveChanges()).done(showSignInPrompt()); 

我把console.log()放在它們的每一個裏面,看看哪個先到達。瞧,後者先來。

我是用這種方法嗎?

這裏的SaveChanges的樣子:

showSavedNotification_check = 1; 

function saveChanges(bypassDeckSave) { 
    // bypassDeckSave = undefined - does not bypass 
    showSavedNotification_check = 1; 
    if(userid != 0) { 
    //values in database 
    var subjectID = $('.lib_folder_id').val(), 
     folderID = $('.lib_subject_id').val(); 
    if(subjectID == 0 || folderID == 0) { //if database values null, ask for some 
     console.log("db deck location not saved, asked for it"); 
     //values to set to 
     var setFolderID = $('.libDeckLocationModifierDiv .folders li.on').val() + 0, 
     setSubjectID = $('.libDeckLocationModifierDiv .subjects li.on').val() + 0; 
     if(isNaN(setFolderID) || isNaN(setSubjectID) || setFolderID == 0 || setSubjectID == 0) { 
     openDeckLocationDiv(); 
     showSavedNotification_check = 0; 
     return; 
     } 
    } 
    } 
    var deck_id = $('.deck_id').val(); 
    if(deck_id == 0) { 
    // create a new deck 
    createDeckThenSave(); 
    return; 
    } 
    if(userid != 0) { 
    //values in database 
    var subjectID = $('.lib_folder_id').val(), 
     folderID = $('.lib_subject_id').val(); 
    if(subjectID == 0 || folderID == 0) { //if database values null, ask for some 
     //values to set to 
     saveDeckLocation(); 
    } 
    } 
    // removes empty rows 
    $('.editMain li').each(function() { 
    var one = $(this).find('.text1').val(), 
     two = $(this).find('.text2').val(); 
    if(one == "" && two == "") { 
     //remove this row and remove value from updateSaveArray + add to delete array 
     var currentval = $(this).val(); 
     var rowid = ".row_" + currentval; 
     updateSaveArray = jQuery.grep(updateSaveArray, function(value) { 
     return value != currentval; 
     }); 
     $(rowid).remove(); 
     updateDeleteArray[updateDeleteArray.length] = currentval; 
    } 
    }); 
    if(bypassDeckSave == undefined) { 
    // save deck info to db 
    var deckname = $('.editDeckNameInput').val(), 
     cardCount = $('.editMain li.mainLi:visible').length, 
     deckTermLanguage = $('.selector.one select').val(), 
     deckDefinitionLanguage = $('.selector.two select').val(), 
     deckThirdBoxLanguage = $('.selector.three select').val(), 
     deckDescription = $('.editMoreDeckOptionsDiv textarea').val(); 
    if($('.editMoreDeckOptionsSelector .onlyme').hasClass("on")) { 
     var viewPreferences = 1; 
    } else { 
     var viewPreferences = 0; 
    } 
    if($('.editUseThirdboxDiv').hasClass('on')) { 
     var thirdbox = 1; 
    } else { 
     var thirdbox = 2; 
    } 
    // console.log("deckInfoSave called"); 
    $.ajax({ 
     type: "POST", 
     url: "/edit/deckInfoSave.php", 
     data: { 
     pDeckid: deck_id, 
     pDeckname: deckname, 
     pCardCount: cardCount, 
     pDeckTermLanguage: deckTermLanguage, 
     pDeckDefinitionLanguage: deckDefinitionLanguage, 
     pDeckThirdBoxLanguage: deckThirdBoxLanguage, 
     pThirdbox: thirdbox, 
     pDeckDescription: deckDescription, 
     pViewPreferences: viewPreferences 
     } 
    }).done(function(data) { 
     // console.log(data); 
     // decksaved = 1; 
    }); 
    } 
    // prepares edited card array 
    // gets all needed values and stores in holdSaveCardArray 
    var holdSaveCardArray = []; 
    for(i = 0; i < updateSaveArray.length; ++i) { 
    var currentCard_id = updateSaveArray[i], 
     rowidClass = ".row_" + currentCard_id, 
     text1val = $(rowidClass + " .text1").val(), 
     text2val = $(rowidClass + " .text2").val(), 
     text3val = $(rowidClass + " .text3").val(); 
    cardOrder = $(".editMain li.mainLi:visible").index($(rowidClass)) + 1; 
    holdSaveCardArray[holdSaveCardArray.length] = { 
     "card_id": currentCard_id, 
     "text1val": text1val, 
     "text2val": text2val, 
     "text3val": text3val, 
     "cardOrder": cardOrder 
    }; 
    } 
    // console.log(print_r(holdSaveCardArray)); 
    // delete cards start 
    // deletes any card with an id in updateDeleteArray 
    $.ajax({ 
    type: "POST", 
    url: "/edit/deleteCards.php", 
    data: { 
     pDeck_id: deck_id, 
     pDeleteArray: updateDeleteArray 
    } 
    }).done(function(msg) { 
    // $('.temp').append(msg); 
    updateDeleteArray = []; 
    }); 
    // save cards to database 
    // loops through each card that had changes made to it 
    $.ajax({ 
    type: "POST", 
    url: "/edit/saveCardsArray.php", 
    dataType: "JSON", 
    data: { 
     pDeck_id: deck_id, 
     pCardArray: holdSaveCardArray 
    } 
    }).done(function(data) { 
    for(var i = 0; i < data.length; i++) { 
     var temp_id = data[i]["temp_id"], // new id 
     card_key = data[i]["card_key"], // old id 
     currentClassName = 'row_' + temp_id, 
     currentClass = '.row_' + temp_id, 
     nextClassName = 'row_' + card_key; 
     $(currentClass).val(card_key); 
     $(currentClass).removeClass(currentClassName).addClass(nextClassName); 
    } 
    }); 
    updateSaveArray = []; 
    // update order start // uses li value 
    updateOrderArray = []; 
    $('.editMain').find(".mainLi").each(function() { 
    var temp = $(this).val(); 
    updateOrderArray[updateOrderArray.length] = temp; 
    }); 
    $.ajax({ 
    type: "POST", 
    url: "/edit/orderCards.php", 
    data: { 
     pUpdateOrderArray: updateOrderArray 
    } 
    }).done(function(msg) { 
    updateOrder = 0; 
    }); 
    closeLibDLM(); 
    console.log("closeLibDLM"); 
    changeSaveStudyButton(1); 
} //saveChanges function end 

日誌底部將在完成區域東西后打印。

+1

您能向我們展示saveChanges實現嗎? – drinchev

+0

@drinchev上傳,對不起,它有點長。 –

+0

使用'.done(showSignInPrompt)'而不是'.done(showSignInPrompt())' - 你必須傳遞一個回調函數*!並用'then'代替'done'。 – Bergi

回答

1

既然你是做多的Ajax調用,你將有你的邏輯稍微改變了。你需要做的是收集這些承諾的數組。創建類似的東西。

var promises = []; 

每當你做一個ajax調用時,將ajax承諾推送到該數組中,並在最後返回它。那麼你的時間邏輯會稍微改變。

$.when.apply(jQuery, saveChanges()).done(...); 

apply()會將數組返回並對待它,就好像您已將每個承諾都當作參數一樣。

僅供參考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

-1

$.when用於運行承諾。

Promise是一個運行異步操作並具有內部回調的函數。

在你的情況下,你需要修改saveChanges()以便返回這種功能。

$.ajax就是這樣一個功能。

所以,你的代碼應該是這個樣子:

function saveChanges() { 

    ... 

    return $.ajax(....) 

} 

那麼你應該做的

$.when(function() { return saveChanges() }) 
.done(function() { return showSignInPrompt() }) 
+0

在這種情況下,有多個ajax調用,是否有可能在'when'中將它們組合在一起?或者我需要爲每個人分別製作謠言? –

+0

不,你不能「跑」承諾。這不是'$ .when'的作用。承諾也不是功能。 – Bergi