在手动结束之前,我应该让javascript函数运行多长时间?

时间:2016-11-22 20:01:03

标签: javascript jquery ajax

我有一个javascript函数,其中包含大约4个ajax请求。运行通常不到一秒钟。但是,我现在正在处理错误处理,并且想知道。在几秒钟内,我应该允许我的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

2 个答案:

答案 0 :(得分:2)

所以你可以完全设置一个任意的超时,甚至是应该包含所有按时完成的一切的超时?但是,当它没有发生时会发生什么?什么时候需要更长的时间才能完成?

那时候,你将会陷入困境。我没有彻底阅读你的代码,但我高度建议尝试使用callback()或Promise来结束你的功能。而且,没有设置超时。 - 这是一个更清洁的解决方案,因为当您需要它们时,以及在发生某些定义之后,就会发生这种情况时间是一个相对的,我们世界的挑剔属性(爱因斯坦证明这个= P)最好被用作你的朋友,而不是你的敌人。

反驳的论点是,有时事情就是悬而未决。而且,这是完全有效的。对于这种情况,您可以设置很长一段时间的超时。但是,再次,这仍然是一个“hacky”&#39;处理事情的方式。在这种情况下,我会尝试创建一些处理来检测错误或超时。即您可以定期检查页面的状态。你可以检查一下你可以挂钩的事件。

如果您可以分享我们的程序挂起的实例,我最好建议一个解决方案。否则,这个问题最终可能会基于编码风格而自以为是。

希望这在某些方面有所帮助:)

答案 1 :(得分:1)

我曾在航空航天工业工作,并在使用微控制器时提出过类似的问题。您似乎正在根据计算寻找合适的超时值,但在您的情况下可能不需要这样做。通常,超时值或多或少是任意的。如果您的函数平均执行大约1秒,那么您的超时值可能设置为3秒。你应该根据测试得出结论。