2010-10-08 25 views
0

所以,我有以下代碼行,在每個循環做一個for循環和科目12。 如果我在帖子前發出提醒,它會按照您的預期提醒號碼(72,60,48,36,24)。 但是,隨着帖子內部的警報,它會提醒數字12五次。 任何想法,爲什麼這是? 12號來自哪裏?jQuery的循環與郵政不正確計數

function loadEstimates(option){ 
    for(term_length=72; term_length>=24; term_length-=12){ 
     var post_options = {loadEstimates: 'true', coverage_option:option, term_length:term_length}; 
     $.post('../includes/process.php', post_options, function(response, status){ 
      alert(term_length); 
     }); 
    } 
} 

問題的第二部分是,我想爲了這些產出和我偶爾注意到,因爲服務器的響應時間後會輸出隨機的東西像36,48,24,72,60 。我怎樣才能把帖子中的'回覆'放到數組中,或者讓我在顯示之前對它進行分類?

謝謝!

///////編輯//////// 好吧,所以我採取了一些ChessWhiz的建議,並使用了一個數組,並提出了。

function loadEstimates(option){ 
    var term_length = new Array('72','60','48','36','24'); 
    var term_length_output = new Array(5); 
    $.each(term_length, function(index, t_length){ 
     var post_options = {loadEstimates: 'true', coverage_option:option, term_length:t_length}; 
     $.post('../includes/process_instantquote.php', post_options, function(response, status){ 
      term_length_output[t_length] = response; 
     }); 
    }); 

    alert(term_length_output); 
} 

這也解決了,如果我決定由12 使用的是不可分的term_length了一些我的未來潛在的難題只是,term_length_output仍是空白。任何想法我做錯了嗎?


**最後編輯* ****

這是我最後使用的代碼。它正是我需要它做的。這可能不是最正確的方法,但它可行。

非常感謝您的回答和幫助!

function loadPriceEstimates(option){ 
    $('#package-term-options table tbody').append('<tr><td style="text-align:center;" colspan="5"><img src="images/ajax-loader-small.gif" alt="Loading..." class="small-loading"/></td></tr>').show(); 
    var term_length = new Array('72','60','48','36','24'); 
    var term_length_output = new Array(); 
    var count = 0; 
    $.each(term_length, function(index, t_length){ 
     var post_options = {loadPriceEstimates: 'true', coverage_option:option, term_length:t_length}; 
     $.post('../includes/process_instantquote.php', post_options, function(response, status){ 
      if(status == 'success'){ 
       term_length_output[t_length] = response; 
       count++; 
       if(count == 5){ 
        term_length_output.sort(); 
        term_length_output.reverse(); 
        $('#package-term-options table tbody').html(''); 
        $.each(term_length_output, function(index, value){ 
         $('#package-term-options table tbody').append(value); 
        }); 
       } 
      } 
     }); 
    }); 
} 
+0

很高興你的工作! Javascript中的閉包是一個棘手的概念。我建議你稍微閱讀一下他們的內容,下次發生這種情況。快樂編程! – ChessWhiz 2010-10-09 00:24:52

回答

1

使用一個索引變量以24爲單位向後計數容易出錯。相反,使用正常的索引,然後計算term_length。接下來,您可以使用數組來存儲結果。但是,如果回調沒有完成運行,數組將不會保留所有結果。最後,你需要創建一個循環變量的副本來轉義閉包。例如:

function loadEstimates(option) { 
    for(i = 0; i < 5; i++) { 
     var resultsIndex = i; 
     var term_length = 72 - (i * 12); 
     var post_options = {loadEstimates: 'true', coverage_option:option, term_length:term_length}; 

     $.post('../includes/process.php', post_options, function(response, status){ 
      results[resultsIndex] = response; 
     }); 
    } 
} 

然後,您的結果將在results陣列中很好地對齊。由於閉合引起的[12,12,12,12,12]副作用基本上是因爲每次輸出term_length的最後一個值,這是因爲for循環的方式,每次都輸出24-12 = 修改它並且函數關閉它。

+0

我只是在想,如果將來我決定用一個不可計算的數字12,那麼我會遇到問題。所以我確實有點喜歡你,並且把數字放到一個數組中。所以,term_length現在很好,但仍然存在數組中結果的問題。 – LostInQuery 2010-10-08 23:36:06

+0

使用你的想法編輯我的帖子,擴大問題的範圍。 – LostInQuery 2010-10-08 23:40:02

+0

請參閱我的編輯以避免在數組索引上關閉。 – ChessWhiz 2010-10-08 23:40:45

2

我認爲這是因爲for循環體不是回調函數閉包的範圍,範圍是容器函數。

試試這個:

function loadEstimates(option){ 
    for(term_length=72; term_length>=24; term_length-=12){ 
     postProcess(term_length); 
    } 
} 

function postProcess(term_length) { 
     var post_options = {loadEstimates: 'true', coverage_option:option, term_length:term_length}; 
     $.post('../includes/process.php', post_options, function(response, status){ 
      alert(term_length); 
     }); 
} 

欲瞭解更多信息,請參閱:

+0

感謝您的信息!我認爲for循環通常是錯誤的方式,以防未來的修改被視爲數學不值錢。我在上面編輯了m原始帖子,向for循環顯示我的解決方案。但是,我的問題仍然存在與陣列無法正常工作。對此有何想法? – LostInQuery 2010-10-08 23:42:45

+0

好吧,現在你有另一個問題。數組的賦值位於異步回調中,數組的警報位於調用函數中。在這種情況下,警報首先出現,然後當服務器回答並且您得到ajax響應時,數組分配會發生。我的建議是做一個獨特的ajax調用,一次處理所有的信息。 – 2010-10-08 23:48:58

1

問題與for的工作方式有關:它在整個生命週期中使用相同的變量(而不是實例化新變量),這意味着每次都會將相同的變量綁定到您的$.post()回調函數。 AJAX調用是異步的,而回調不會被調用,直到你的循環已完成,term_length作出了一路下跌至12

對於JavaScript之外的一般問題的討論之後,看到"Python's lambda is broken!"

那麼,解決方案就是以某種方式獲取JavaScript,以在每次迭代中實例化一個新變量,以便在循環過程中不會從您的下面更改。一種方法是通過一個函數來傳遞它。請參閱Nicolas Bottarini對代碼的回答。