2017-07-15 89 views
0

我试图实现同一个asynchronous方法的链接。基本上我想要做的只是拨打animation.animate({}).animate({})。第一个完成后需要调用第二个动画方法。异步方法链接

这是我做的,我认为它很接近,但我仍然无法找到如何使它工作。

class Animation { 

    constructor() { 
     this.queue = new Promise((resolve,reject)=> {resolve()}) 
    } 

    animate(params) { 
     this.queue.then(() => { 
      return this.cssAnimate(params); 
     }) 
     return this; 
    } 

    cssAnimate(params) { 
     return new Promise((resolve,reject) => { 
     //do stuff to animate 

     params.el.addEventListener('transitionend',() => {resolve()}) 
     }) 
    } 

} 

let animation = new Animation(); 

animation 
    .animate({}) 
    .animate({}) 
+0

是什么/是不会发生,你是不是/正在期待? – naomik

+0

什么部分不起作用?我认为关键在于确保只有在确定动画完成后才在'cssAnimate()'中调用resolve()。 – gregnr

回答

0

您需要重新分配this.queue一个新的承诺你从 'this.queue.then'

class Animation { 
 

 
    constructor() { 
 
    this.queue = Promise.resolve() 
 
    } 
 

 
    animate(params) { 
 
    this.queue = this.queue.then(() => this.cssAnimate(params)) 
 
    return this; 
 
    } 
 

 
    cssAnimate(params) { 
 
    const {el, clz} = params 
 
    
 
    return new Promise(resolve => { 
 
     el.addEventListener('transitionend', resolve) 
 
     el.classList.toggle(clz) 
 
    }) 
 
    } 
 
} 
 

 

 
document.querySelector('#play').addEventListener('click',() => { 
 
    let animation = new Animation(); 
 
    const el = document.querySelector('.box') 
 

 
    animation 
 
    .animate({ 
 
     el, 
 
     clz: 'left' 
 
    }) 
 
    .animate({ 
 
     el, 
 
     clz: 'left' 
 
    }) 
 
})
.box { 
 
    background-color: pink; 
 
    width: 100px; 
 
    height: 100px; 
 
    margin-left: 0; 
 
    transition: all 3s linear; 
 
} 
 

 
.left { 
 
    
 
    margin-left: 200px; 
 
}
<div class="box"></div> 
 
<button id="play">Play</div>

+0

完美,这正是我想要做的,谢谢:) – odakfilo8