2011-06-09 39 views
0

所以,我使用JQuery AjaxQueue做的東西,但我有的問題是,我不知道如何使它繼續,只有整個隊列完成後。我希望它通過檢查表來檢查是否有東西被刪除,然後在它完成後繼續。現在發生的事情是,隊列中的東西將與其周圍的東西同時處理,因此它在繼續之前不會執行ajax調用。處理Ajax隊列代碼,然後繼續

var outputString = ""; 
    $('#errors').html(""); 

    $("#deletingitems tbody tr").each(function() { 
     if(rowCounter == 1) { 
      htmltext.append(TopofHTMLPage()); 
     } 

     var tableValA = $(this).find("td").eq(0).html(); 
     var tableValB = $(this).find("td").eq(1).html().split("/")[0]; 

     $.ajaxQueue({ 
      type: "POST", 
      url: "@Url.Content("~/webservices/retrieve.asmx/Get")", 
      data: "{'index': '" + tableValA + "', 'identity': '" + tableValB + "'}", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (msg) { 

       //http://encosia.com/2009/06/29/never-worry-about-asp-net-ajaxs-d-again/ 
       if (msg.hasOwnProperty("d")) { 
        // Leave the .d behind and pass the rest of 
        // the JSON object forward. 
        outputString = msg.d; 
        $('#errors').append(outputString); 
        if(obj.valA != null) { 
         htmltext.append('<tr>'); 
         htmltext.append('<td>' + obj.valA + '</td>'); 
         htmltext.append('<td>' + obj.valB + '</td>'); 
         htmltext.append('<td>' + obj.valC + '</td>'); 
         htmltext.append('<td>' + obj.valD + '</td>'); 
         htmltext.append('<td>' + obj.valE + '</td>'); 
         htmltext.append('</tr>'); 
        } 
       } 
      } 
      , error: AjaxFailed 
     }); 

     if(rowCounter == 10) { 
      htmltext.append(BottomofHTMLPage()); 
      rowCounter = 1; 
     } 
     else { 
      rowCounter++; 
     } 
    }); 
    // Add rows until 10 rows 
    while(rowCounter <= 10) { 
     htmltext.append('<tr><td></td><td></td><td></td><td></td><td></td><td></td></tr>'); 
     rowCounter++; 
    } 

    htmltext.append(BottomofHTMLPage()); 

    htmltext.append('</body>'); 
    htmltext.append('</html>'); 
    var page = window.open('','NewHTMLPage','width=1500,height=600,scrollbars=yes'); 
    page.document.open(); 
    page.document.write(htmltext.toString()); 
    page.document.close(); 
+0

'stringVal'在哪裏使用? – 2011-06-09 12:25:55

+0

@Gary'stringVal'將追加到我創建的htmlstring中,該htmlstring將用於創建將彈出的新頁面。 – 2011-06-09 12:37:30

+0

啊,使用回調技術,如我在下面的回答 – 2011-06-09 12:41:42

回答

0

我不熟悉AjaxQueue但它看起來像你可以acheive你做什麼簡單地使用jQuery核心,只需使用一個回調:

var gotAttribute = function(attr) 
{ 
    $("#deletingitems tbody tr").each(function() { 
     if (this.value == 1) { 
      // Do stuff with attr? 
     } 
    } 
}; 

// jQuery will pass the result onto gotAttribute once available 
$.ajax({ success: gotAttribute }); 
+0

這將做相反的事情,它會調用ajax然後檢查表,我想檢查表,然後將表中的值傳遞到ajax。 – 2011-06-09 12:41:29

+0

我明白你的意思了。你在'$ .ajaxQueue'裏面有什麼? – 2011-06-09 12:44:17

+0

[ajaxQueue](http://stackoverflow.com/questions/3034874/sequencing-ajax-requests/3035268#3035268)(請參閱鏈接)只是編寫用於模擬Ajax調用隊列的代碼。在它裏面,我使用表中的值並調用WebService來檢查數據庫中是否存在具有這些值的條目,然後返回消息說明它是否存在。 – 2011-06-09 12:47:08

0

阿賈克斯是異步的(如應ajaxQueue,否則它不會是ajax)。這意味着當你提出請求時,你的代碼會繼續,而Ajax會提取請求的數據。當數據準備就緒時,您的回傳將被執行,並且在您的主線代碼完成後會發生(請檢查Is JavaScript multithreaded?)。所以這就是爲什麼你的表格行在關閉html標籤後出現的原因。

要解決您的問題,您需要將您的結束代碼放入回調中,並檢測上次請求何時完成。

jQuery(function ($) { 
    var i = 0; 
    $('tr').each(function() { 
     i++; 
     $.ajax({ 
      url: 't.html', 
      success: function (data) { 
       console.log('serving: ' + i); 
       if(--i <= 0) { 
        console.log('which was the last'); 
       } 
      } 
     }); 
    }); 
}); 

這同樣適用於ajaxQueue。

相關問題