2016-11-20 8 views
0

jQueryは呼び出す前に関数で終了するのを待っていません。jQueryが終了するまでに完了するのを待っていません

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

console.log()の中にconsole.log()を入れて、どちらが最初に来るのかを確認します。そして、見よ、後者が最初に来る。

私はこれを間違った方法で使用していますか?

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 

下部のログが行われた領域で何か後に印刷されます:

は、ここのようなのSaveChangesが見えるものです。

+1

「saveChanges」の実装も表示できますか? – drinchev

+0

@drinchevがアップロードされました。申し訳ありませんが、それは長いです。 –

+0

'.done(showSignInPrompt())'の代わりに '.done(showSignInPrompt)'を使う - あなたはコールバック*関数*を渡す必要があります!そして、 'done'の代わりに' then'を使います。 – Bergi

答えて

1

を行う必要があります

function saveChanges() { 

    ... 

    return $.ajax(....) 

} 

。あなたがしなければならないことは、それらの約束を集めることです。のようなものを作成します。

var promises = []; 

ajax呼び出しを行うたびに、その配列にajax promiseをプッシュし、最後に戻します。その後、あなたのロジックが少し変わるでしょう。

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

適用されます()返された配列を取ると、あなたが引数としてときにそれらの約束のそれぞれに与えられたかのように扱います。

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

-1

$.whenは、約束を実行するために使用されます。

Promiseは、非同期操作を実行しており、内部コールバックを持つ関数です。

saveChanges()を修正する必要がある場合は、この種の機能を返すようにしてください。

$.ajaxはそのような関数です。

だからあなたのコードは次のようになっているはずです。そして、あなたは複数のAjax呼び出しを行っているので、あなたは少しあなたのロジックを変更する必要があります

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

この場合、複数のajax呼び出しがあります。それらをすべて 'when'で組み合わせることは可能ですか?あるいは、それぞれのために別々の時間を作る必要がありますか? –

+0

いいえ、約束を「実行」することはできません。それは '$。 'がするものではありません。約束は機能でもない。 – Bergi

関連する問題