2016-12-15 29 views
0

我想知道爲什麼下面的代碼不會等待動畫在循環中開始下一個動畫之前完成。在'for'循環中使用Jquery promise()等待效果在開始下一個效果之前完成

由於某些原因,循環創建的所有元素都會一次顯示並同時淡入。從代碼中,我期望在循環的第一次迭代完成之前,第一個元素會完成淡入,然後'for'循環的第二次迭代將在下一個元素中淡入淡出,依次類推。

我做不希望在創建凌亂代碼之前使用回調,並且我想使用將使用動態數據的循環 - 動畫的數量會有所不同。

<div id="container"></div> 

<script> 
var data = [1,2,3,4]; 

for(var i = 0; i < data.length; i++){ 
    $("#container").append("<h1>"+data[i]+"</h1>").hide().show("fade",2000); 
    $("#container").promise().done(function(){console.log('sweet');}); 
} 
</script> 
+1

我不認爲你可以達到循環。使用Promise鏈和一些帶有計數器的遞歸函數。第一承諾解決退貨第二承諾等 –

+0

對不起,不明白你的意思。你能提供代碼示例嗎?我搜索了互聯網,但找不到任何描述循環和使用可用於jQuery效果的承諾.. – Trevor

回答

2

承諾不是奇蹟般地停止你的for循環,他們做的是提供了一種鏈回調。你正在做所有的動畫,並同時等待完成。爲了讓他們順序,你可以使用

<div id="container"></div> 
<script> 
[1,2,3,4].reduce(function(prev, d, i) { 
    return prev.then(function() { 
     console.log('start', i) 
     return $("<h1/>", {text: d}) 
     .appendTo("#container") 
     .hide().show("fade",2000) // I assume you meant to animate the h1, not the container 
     .promise(); 
    }).then(function() { 
     console.log('sweet! end', i); 
    }); 
}, $.when()); 
</script> 
+0

非常感謝,按照我想要的方式工作。是否可以解釋: – Trevor

+0

非常感謝,按照我想要的方式工作。是否有可能解釋:1)這行是做什麼「return prev.then(function(){」和2)「$ .when()」部分在做什麼(我認爲這是初始值)? – Trevor

+1

是的,'$ .when()'是初始值 - 一個承諾立即滿足'undefined'。 'return prev.then(...)'將前一個承諾的回調函數鏈接到執行完成時,並返回一個新的promise(它將等待回調的結果,返回的'.promise()')在下一次迭代中用作'prev'。 – Bergi

相關問題