2016-11-22 58 views
0

我有一個JavaScript函數,它有大約4個Ajax請求。通常運行時間不到一秒鐘。但是,我現在正在處理錯誤處理並想知道。在幾秒鐘內,我應該允許我的javascript函數嘗試繼續工作,直到我手動取消並允許用戶再次嘗試?我應該在手動結束之前讓javascript函數運行多久?

下面是有問題的功能的樣子。 (不是一切都在那裏,但它可能有(1000 * 5000 * 3)+(70​​)+(1000)+(6)+(2500)字節發送)

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(), 
      setSubjectID = $('.libDeckLocationModifierDiv .subjects li.on').val(); 

     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; 
     saveDeckInfoHasFinished = 1; 
    }); 
    }else{ 
    saveDeckInfoHasFinished = 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 = []; 
    deleteCardsHasFinished = 1; 
    }); 



    // 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); 
    } 
    saveCardsHasFinished = 1; 
    }); 
    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; 
    updateOrdersHasFinished = 1; 
    }); 


    closeLibDLM(); console.log("closeLibDLM1"); 
    changeSaveStudyButton(1); 


} //saveChanges function end 
+0

我其實認爲這個問題是以意見爲導向的,所以我打算將其標記爲這樣。確定你應該設置你的超時時間是主觀的。 – Fallenreaper

+0

無法從這些代碼中看出太多。看起來你在寫某種類型的紙牌遊戲。我猜想應該不會花太長時間來計算結果。如果花費很長時間,您可能需要修改算法。也取決於你的應用程序的性質,玩家等待時間可能會有所不同,所以Fallenreaper對此表示自己的評價是正確的。 –

+0

儘量不要下載似乎超過10Mb的內容。移動用戶會感謝你。 – Timo

回答

2

那麼你可以完全設置一個任意的超時時間,或者甚至是一個超時,應該包括按時完成的所有事情嗎?但是,如果沒有,會發生什麼?當完成需要更長的時間時會發生什麼?

在這一點上,你會成爲一個泡菜。我沒有完全讀你的代碼,但我會高度建議嘗試使用回調()或承諾來結束你的功能。而且,沒有設置超時。 - 這是一個更清潔的解決方案,當你想要它們時發生事情,並且在發生了一些定義之後。時間是我們世界的一個親戚和挑剔的屬性(愛因斯坦證明了這一點= P),它最適合用作你的朋友,而不是你的敵人。

相反的觀點是,有時候事情只是掛起。而且,這是完全有效的。對於這種情況,您可以設置很長一段時間的超時時間。但是,再次,這仍然是一種'哈克'的方式來處理事情。在這種情況下,我會嘗試創建一些處理來檢測錯誤或超時。即您可以定期檢查頁面的狀態。你可以查看哪些事件存在,你可以進入。

如果您可以分享我們的程序掛起的情況,我可以更好地提出解決方案。否則,這個問題最終可能會基於編碼風格而受到譴責。

希望這有助於某些方面:)

1

我已經工作在與微控制器一起工作時也曾遇到類似的問題。看來你正在尋找一個適當的基於計算的超時值,但這可能不是必要的在你的情況。通常情況下,超時值或多或少是任意的。如果您的函數平均執行大約1秒,那麼您的超時值應該設置爲3秒。你應該根據測試得出結論。

相關問題