promise与settimeout的应用

本文详细介绍了如何使用CSS3实现卡牌翻转效果,并结合JavaScript的setTimeout和Promise处理翻转后的异步操作,如显示提示信息及多卡牌连续翻转的控制流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事情是这样的,我写了一个活动,活动里面有一个卡牌翻转效果,它长这样:
单张
一个典型css3的翻转,与标题看起来并无什么关系。然后我又写了这样三个卡牌的翻转,它长这样:
多张翻转
看起来的步骤是:1.当卡牌翻转完毕之后,显示提示文案。2.当步骤1完成之后,将剩下的卡牌也翻转。跟延迟操扯上关系辽。于是奇怪的博客诞生了。因为没有用到setInterval所以没有说明。

这三者的的理解可以配合一位大佬写的js的事件循环机制和任务队列食用,会理解的更好一点。

setTimeout

settimeout表示指定的毫秒数后调用定义的函数。

settimeout执行的全步骤为:
* 在指定毫秒数后将代码块放入任务队列中等待执行。
* 等待执行栈中的任务执行完毕
* 执行栈中的任务执行完毕后,任务队列中的任务取出放入执行栈中执行。

settimeout应用:单张卡片翻转,当点击的卡片翻转完毕之后,显示提示信息。

	<style>
	@keyframes rotate {//反面从0翻转180度,并隐藏卡片反面
		  100% {
		    transform: rotateY(180deg);
		    display: none;
		  }
		}
	@keyframes rotate1 {//正面从负180翻转到0度
	  0% {
	    transform: rotateY(-180deg);
	  }
	}
	.wraper {
	  width: 148px;
	  height: 250px;
	  cursor: pointer;
	  position: relative;
	}
	.wraper .backface,
	.wraper .open {
	  width: 100%;
	  height: 100%;
	  position: absolute;
	}
	.wraper .backface {
	  background: url("../../img/pc/star_52.png") no-repeat center center;
	  backface-visibility: hidden;
	}
	.wraper .open {
	  background: url("../../img/pc/star_53.png") no-repeat center center;
	}
	.wraper .open .gift {
	  padding-top: 97px;
	  margin-bottom: 14px;
	}
	.wraper .open .gift > div {
	  width: 75px;
	  margin: 0 auto;
	  margin-bottom: 35px;
	}
	li p {
	  width: 108px;
	  font-size: 12px;
	  font-weight: 400;
	  color: #103a5c;
	  line-height: 18px;
	  margin: 0 auto;
	}
	li .tips {
	  color: #cfefff;
	}
	.rotate {// forwards表示动画执行完毕后保持动画最后一秒的状态
	  animation: rotate 1s linear forwards;
	}
	 .rotate1 {
	  animation: rotate1 1s linear forwards;
	}
	</style>
	<div class="wraper" @click="rotate">
         <div :class="[{'rotate1':rotate},'open']">
             <div class="gift">
                 <div>
                     <img src="./activity/img/star_movement/pc/34.png" alt="">
                  </div>
                   <p>
                       奖励内容
                   </p>
             </div>
             <p :class="[{'hidden':rotate1},'tips']">
                    奖励已放入您的账户
                    中请查看使用!
             </p>
         </div>
         <div :class="['backface',{'rotate':rotate}]"></div>
     </div>
    <script>
		new Vue({
			el:'.wraper',
			data:{
			rotate:false,//控制卡片正反面的翻转动画
			rotate1:false//控制提示文案的显示与隐藏
			},
			methods:{
		        rotate() {
		            this.rotate = !this.rotate
		            // var _this = this 
		            if (this.rotate == true) {
		                var tmp = setTimeout(() => {
		                    this.msgtip = this.rotate
		                    clearTimeout(tmp);
		                    }
		                }, 1000);
		            } else {
		                this.rotate1 = this.rotate
		            }
        			},
		})
	</script>

这里使用了settimeout计时器,表示一秒后执行显示提示文案的操作。

promise

用处:
1、主要用于异步计算
2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
3、可以在对象之间传递和操作promise,帮助我们处理队列

用自己理解的话来说,promise就是用于实现你所期望的代码执行顺序。
	var p = new Promise((resolve,reject)=>{
			console.log('code1');
			resolve('code1执行完毕')
	});
	p.then(res=>{
		console.log(res);
		console.log('code2执行完毕')
	})

执行结果:
执行结果
promise在实例化时,同步代码块被放入主线程的执行栈中执行,并且产生的异步任务被放入任务队列。
而任务队列中的任务总是要等到执行栈的任务全部执行完毕之后才可以执行。
promise应用:多卡牌翻转,选中的卡牌翻转完毕后,剩下的卡牌开始翻转

 <ul class="content">
       <li v-for="(item,i) in cardList">
        <div class="wraper" @click="flop(i,item)">
          <div :class="[{'rotate1':item.rotate},'open']">
                <div class="gift">
                     <div>
                        <img src="./activity/img/star_movement/pc/34.png" alt="">
                     </div>
                </div>
               <p :class="[{'hidden':(!item.msgtip||i!==chooseIndex)},'tips']">
                    奖励已放入您的账户
                    中请查看使用!
                 </p>
          </div>
          <div :class="['backface',{'rotate':item.rotate&&!item.res}]"></div>
       </div>
    </li>
</ul>
new Vue({
el:'.content',
data:{
 cardList: [{
            rotate: false,
            msgtip: false,
        }, {
            rotate: false,
            msgtip: false,
        }, {
            rotate: false,
            msgtip: false,
        }],
        chooseIndex: null//被选择的卡牌
        },
methods:{
  rotate(obj,fn) {
            console.log(obj)
            obj = obj || null
            obj.rotate = !obj.rotate
            // var _this = this 
            if (obj.rotate == true) {
                var tmp = setTimeout(() => {
                    obj.msgtip = obj.rotate
                    clearTimeout(tmp);
                    if(fn){
                    	fn()
                    }
                }, 1000);
            } else {
                obj.msgtip = obj.msgtip
            }
        },
flop(i,obj){
        // 用户选择的牌翻转完毕以后,将剩下的牌也进行翻转
          var _this = this;
          _this.chooseIndex = i;
           var p = new Promise((resolve, reject) => {
                   _this.rotate(_this.cardList[i], resolve),//翻转选择的卡牌
                })
             p.then(() => {//选择的卡牌翻转完毕之后,将剩下的卡片翻转
                  _this.cardList.forEach((item, index) => {
                      if (index !== i) {
                           _this.rotate(item)
                          }
                          });
                    })
            }
    }
})
### 回答1: promisesetTimeout都是JavaScript中常用的异步编程方式,但是它们的应用场景和特点略有不同。 promise是一种用于处理异步操作的对象,它可以将异步操作的结果传递给相关代码,以便于异步操作完成后进行后续处理。Promise有三种状态:Pending(进行中)、Resolved(已完成)和Rejected(已失败),当异步操作完成后,可以将Promise状态从Pending改为Resolved或者Rejected,并将相应的结果传递给相关代码。 setTimeout是一种用于在一定时间后执行某个函数的方法。它会在指定的时间间隔之后将指定的代码添加到任务队列中,并在执行栈为空时执行该代码。setTimeout是一种延时执行的方法,通常用于在等待一段时间之后执行某些操作,比如延迟加载资源或者实现一些动画效果。 从应用场景来看,Promise通常用于需要处理异步操作结果的场景,而setTimeout通常用于需要在一定时间之后执行某些代码的场景。从技术特点来看,Promise可以很好地处理异步操作的结果,而setTimeout主要是用于延时执行某些代码。因此,在不同的场景下,选择使用Promise或者setTimeout都需要考虑具体的需求和实现方式。 ### 回答2: 在JavaScript中,PromisesetTimeout是两个不同的概念,它们的执行顺序取决于具体的代码逻辑和使用方式。 Promise是一种异步编程的解决方案,用于处理一些需要花费时间的操作。当我们创建一个Promise对象时,其中的代码会被立即执行,并且可以设置回调函数处理异步操作的结果。一旦Promise对象的状态发生改变(可以是fulfilled满足或rejected拒绝),相应的回调函数将会被调用。 而setTimeout是JavaScript的一个定时器函数,用于在指定的延迟时间之后执行一段代码。当我们使用setTimeout函数时,其中的代码会被放入到一个任务队列中,在指定的延迟时间之后,才会被执行。 根据执行机制,Promise通常拥有更高的优先级。Promise对象中的代码会立即执行,而setTimeout中的代码则会在其他同步任务执行完毕后才会被执行。也就是说,Promise中的代码会被优先执行,而setTimeout中的代码会在Promise对象执行完毕后才会被执行。 然而,如果我们使用了async/await等异步操作,PromisesetTimeout的执行顺序就有可能受到影响。在这种情况下,可能会出现在Promise中的代码还未执行完毕,但由于设置了一个较短的延迟时间,setTimeout中的代码先被执行的情况。 总结起来,Promise通常拥有更高的优先级,其代码会立即执行。setTimeout中的代码会在Promise代码执行完毕后才会被执行,除非使用了某些特殊的异步操作方式。 ### 回答3: PromisesetTimeout没有优先性的比较,因为它们是完全不同的东西。 Promise是一种处理异步操作的机制,它可以用于处理异步操作的状态和结果。当我们创建一个Promise对象时,它可以包含异步操作的结果,并提供一些方法来处理成功或失败时的逻辑。Promise的执行顺序由代码中的逻辑和异步操作的执行时间决定,setTimeout没有直接的关系。 setTimeout是一个用于设置在一定延迟时间后执行的函数的方法。它允许我们在指定的延迟时间之后执行一段代码。setTimeout的执行时间是相对于调用它的时刻来计算的,它不受Promise的状态或结果影响。 根据上述解释,PromisesetTimeout在执行顺序上没有优先性的比较。它们是独立的概念,用于不同的目的。Promise用于处理异步操作的状态和结果,而setTimeout用于延迟执行一段代码。在实际开发中,我们可以根据需求选择使用PromisesetTimeout,或者它们的组合来处理不同的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值