为了账号安全,请及时绑定邮箱和手机立即绑定

请问为什么动画效果在首次运行完ball1,ball2,ball3后再继续运行就没反应了~我明明加上了二次运行ball1,ball2,ball3啊!

<!doctype>

<!DOCTYPE html>

<html>

<head>

<title>promise animation</title>

<style type="text/css">

.ball{

width: 40px;

height: 40px;

border-radius: 20px;

}

.ball1{

background-color: red;

}

.ball2{

background-color: yellow;

}

.ball3{

background-color: green;

}

</style>

<script type="text/javascript" src="./node_modules/bluebird/js/browser/bluebird.js"></script>

</head>

<body>

<div class="ball  ball1" style="margin-left: 0px;"></div>

<div class="ball  ball2" style="margin-left: 0px;"></div>

<div class="ball  ball3" style="margin-left: 0px;"></div>

<script type="text/javascript">

var ball1=document.querySelector('.ball1')

var ball2=document.querySelector('.ball2')

var ball3=document.querySelector('.ball3')


// function animate(ball,distance,cb){

// setTimeout(function(){

// var marginLeft=parseInt(ball.style.marginLeft,10)


// if(marginLeft === distance){

// cb && cb()

// }else if (marginLeft<distance) {

// marginLeft++

// }else{

// marginLeft--

// }

// ball.style.marginLeft=marginLeft + 'px'

// animate(ball,distance,cb)

// },13)

// }


// animate(ball1,100,function(){

// animate(ball2,200,function(){

// animate(ball3,300,function(){

// animate(ball3,150,function(){

// animate(ball2,150,function(){

// animate(ball1,150,function(){

// })

// })

// })

// })

// })

// })

var Promise = window.Promise


function promiseAnimate(ball,distance){

return new Promise(function(resolve,reject){

function _animate(){

setTimeout(function(){

var marginLeft=parseInt(ball.style.marginLeft,10)


if(marginLeft === distance){

resolve()

}else if (marginLeft<distance) {

marginLeft++

}else{

marginLeft--

}

ball.style.marginLeft=marginLeft + 'px'

_animate()

},13)

}

_animate()

})

}


promiseAnimate(ball1,100)

.then(function(){

return promiseAnimate(ball2,200)

})

.then(function(){

return promiseAnimate(ball3,300)

})

.then(function(){

return promiseAnimate(ball3,150)

})

.then(function(){

return promiseAnimate(ball2,150)

})

.then(function(){

return promiseAnimate(ball1,150)

})

</script>

</body>

</html>

http://img1.sycdn.imooc.com//5804643100013f1515630847.jpg

正在回答

2 回答

我也不是很理解,难道第一个球跑到位置了,没有对其释放,然后又一次执行到这个任务了,就会发生两个任务在竞争,最后一直卡在这个timer里面没出来?

0 回复 有任何疑惑可以回复我~

按照你的写法做了修改,因为当小球的margin-left不等于传参distance时,需要调用_animate方法让小球执行动画

if(marginLeft === distance){

resolve()

}else if (marginLeft<distance) {

marginLeft++

ball.style.marginLeft=marginLeft + 'px'

_animate()

}else{

marginLeft--

ball.style.marginLeft=marginLeft + 'px'

_animate()

}


0 回复 有任何疑惑可以回复我~
#1

Conqueror1st

写在外面为什么就调用不了?else结束之后不是也一样调用么
2017-03-02 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
进击Node.js基础(二)
  • 参与学习       76755    人
  • 解答问题       226    个

本教程带你攻破 Nodejs,让 JavaScript流畅运行在服务器端

进入课程

请问为什么动画效果在首次运行完ball1,ball2,ball3后再继续运行就没反应了~我明明加上了二次运行ball1,ball2,ball3啊!

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信