2013-05-17 141 views
0

我正在試着學習jQuery Deferred s,最好的學習方法可能是嘗試在你自己的例子中理解它們。我試着在show然後fadeout(1000毫秒)之後向用戶發送一條消息,他點擊了按鈕並且在ajax成功執行後。當用戶點擊幾秒鐘時,消息只顯示一次。我想這種情況: 用戶在一秒鐘內點擊7次,並且該消息框連續七次顯示並淡出。整個過程可能需要7秒鐘。的代碼 幾行:Jquery推遲執行

$("#AddToCart").click(function() { 

      var wantedquantity = $("#wantedquantity").val();    
     $.ajax({ 
       type: "POST", 
       url: ROOT + "Cart/AddToCart", 
       data: { idd: '@Model.Id', quantity: wantedquantity }, 
       success: function() {    
        $("#cartNumber").load(ROOT + 'Cart/_NOfItemsInCart'); 
        $("#MessageAddedToCart").css("visibility", "visible").css("display", "block").css("box-shadow", "6px 6px 4px 4px #808080").html("Product added to cart"); 
        $("#MessageAddedToCart").fadeOut(1000, function(){ 
        }); 
       } 
      }); 
     }); 
    }); 
+3

有一個問題在這裏? –

+1

另外,你說單擊7次消息框應該顯示和淡出7次,但是你是否也想連續7次連續執行POST? –

+0

是的,我也想要它 –

回答

0

我覺得.queue會在這裏工作:

$("#AddToCart").click(function() { 
    $(this).queue(function(next) { 
     $.ajax({ 
      // other stuff 
      success: function() { 
       $("#cartNumber").load(ROOT + 'Cart/_NOfItemsInCart'); 
       $("#MessageAddedToCart") 
        .css({ 
         visibility: "visible", 
         display: "block", 
         "box-shadow": "6px 6px 4px 4px #808080" 
        }) 
        .html("Product added to cart"); 
        .fadeOut(1000, function() { 
         next() 
        }); 
      }, 
      error: function() { next(); } 
     }); 
    }); 
}); 
+0

它工作(如預期顯示消息),如果你忽略了ajax不起作用的事實。 ajax作爲ajax可以異步返回嗎? –

+0

是的,它可以。你換了// //其他東西嗎? – Eric

+0

是的。我做到了。幾乎沒有錯誤。它的工作方式與預期一致 –

0

可以爲一個deferred鏈處理程序一起使用.then。看文檔。

0

像這樣?

var requests = []; 
$("#AddToCart").click(function() { 
    var new_def = $.Deferred(); 
    var call = function() { 
     $.ajax({ 
      // other stuff 
      success: function() { 
       // other stuff 
       $("#MessageAddedToCart").fadeOut(1000, function() { 
        // remove request from requests 
        var idx = requests.indexOf(new_def); 
        if (idx !== -1) { 
         requests.splice(idx, 1); 
        } 
        // mark it as resolved 
        new_def.resolve(); 
       }); 
      } 
     }); 
    }; 

    var def = requests[requests.length-1]; 
    if (def) { 
     def.done(call); 
    } else { 
     call(); 
    } 
    requests.push(new_def); 
});