【问题标题】:Using async/await to pause GSAP Flip animation使用 async/await 暂停 GSAP Flip 动画
【发布时间】:2021-10-04 18:53:06
【问题描述】:

我正在使用 GSAP 的 Flip 插件来制作从屏幕角落到中心的加载动画,然后在页面加载时返回。我认为这样做的一个好方法是使用 async/await 暂停脚本,直到切换 hide_logo_animation 布尔值。

这是我的尝试(使用正方形代替),但它什么也没做。没有错误所以我不知道如何调试它。

我在这里做错了什么?我希望它会翻转两个方块的位置并等待我切换 hide_logo_animation 后再切换回来。

<div class="container">
  <div class="square" id="sq1">1</div>
  <div class="square" id="sq2">2</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.7.1/gsap.min.js"></script>
<script src="https://assets.codepen.io/16327/Flip.min.js"></script>
body {
  background-color: #222;
  font-family: "Signika Negative", sans-serif, Arial;
}

.container {
  display: -webkit-box;
  display: flex;
  -webkit-box-pack: justify;
  justify-content: space-between;
}

.square {
  width: 100px;
  height: 100px;
  font-size: 3em;
  display: -webkit-box;
  display: flex;
  -webkit-box-pack: center;
          justify-content: center;
  -webkit-box-align: center;
          align-items: center;
  color: black;
  background-color: #88ce02;
  cursor: pointer;
}
gsap.registerPlugin(Flip);

var hide_logo_animation = false
showLogoAnimation(hide_logo_animation)

async function showLogoAnimation(hide_logo_animation) {
    const logo_state = Flip.getState("#sq1", {})
    Flip.from(logo_state, {
        targets: '#sq2',
        duration: 0.75,
        ease: "power1.inOut"
    })
    await hide_logo_animation
    const logo_animation_state = Flip.getState("#sq2", {})
    Flip.from(logo_animation_state, {
        targets: '#sq1',
        duration: 0.75,
        ease: "power1.inOut"
    })
}

编辑:这是一个 Codepen/minimal 示例,展示了我正在尝试做的事情。 div 词立即更改为“随机”,但我希望它等到我切换 bool is_word_random。

我也愿意接受其他方法。我更愿意使用全局事件侦听器来等待值发生变化,但我找不到这样做的示例。我发现监听变量更改的唯一方法是 get/set 我被告知已过时,应该使用 async/await 来代替?

https://codepen.io/TheNomadicAspie/pen/qBmYEeJ

<div id="word">Word</div>
#word {
  font-size: 50px;
}
var is_word_random = false;
makeWordRandom();
waitFiveSeconds();

async function makeWordRandom() {
  await is_word_random;
  word.innerText = "Random";
}

function waitFiveSeconds() {
  setTimeout(() => {
    is_word_random = true;
  }, 5000);
}

【问题讨论】:

    标签: javascript gsap


    【解决方案1】:

    在这种情况下,它有助于对核心问题进行更多最小化的演示。在这种情况下,也许这个最小的 JS 代码可以帮助您理解问题:

    let myBool = false;
    myFunc(myBool);
    
    async function myFunc(bool) {
      console.log(bool);
      await bool;
      console.log("This fires immediately");
    }
    

    如您所见,您的await 只是在等待一个布尔类型的变量。 await 与 Promise 一起使用(包括使用 Promise.all() 做出的承诺或从函数返回的承诺)。所以这是你的问题。

    如果你想使用async/await,我建议从makeWordRandom函数调用wait函数并从waitFiveSeconds返回一个promise:Demo


    我不确定您为什么要在这里使用异步函数。每当您计划切换布尔值时,我可能会在加载时调用函数的第一部分,然后调用第二部分。像这样:

    function showLogoAnimation() {
        const logo_state = Flip.getState("#sq1", {});
        Flip.from(logo_state, {
            targets: '#sq2',
            duration: 0.75,
            ease: "power1.inOut"
        });
    }
    
    function hideLogoAnimation() {
      const logo_animation_state = Flip.getState("#sq2", {});
      Flip.from(logo_animation_state, {
          targets: '#sq1',
          duration: 0.75,
          ease: "power1.inOut"
      });
    }
    
    showLogoAnimation();
    
    // Whenever you were changing the boolean, just call hideLogoAnimation() instead
    

    【讨论】:

    • 谢谢,但我正在逐行调试,但仍然无法弄清楚为什么会这样。虽然我花了几天时间学习 async/await 和 Promise,但从字面上阅读我能找到的所有内容,这是我从未真正理解过的一个概念。我现在再次阅读它们以尝试理解,但我不明白这不是正确的方法。我在网上看到几个人建议使用 async/await 来等待变量更改。不过谢谢。
    • @TheNomadicAspie 你能发一个minimal, complete, and verifiable example吗?你甚至根本不需要包含 GSAP/Flip 插件
    • 当然我编辑了我的原始帖子以显示。我愿意使用其他方法,并且我更喜欢使用全局事件侦听器,因为在我的实际代码中我有一个包含多个布尔值的 state_dict 对象。理想情况下,我想在 state_dict 更改时调用一个函数并使用它来控制我的动画,但是我再次在 Javscript 中找不到这样做的方法,所以尝试了 async/await,因为它经常被建议。大多数关于监听变量变化的帖子都已经过时了,最近的 cmets 警告不要使用这些方法,但没有提供一个清晰的例子来说明现在应该如何做。
    • @TheNomadicAspie 感谢您的尝试,但您的最小示例永远不会改变布尔值的状态。你能把它也包括在你的娱乐活动中吗?
    • 抱歉,我用 setTimeout 更新了示例,在切换布尔值之前等待 5 秒。
    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 2012-04-06
    • 1970-01-01
    • 2016-03-28
    • 2013-11-25
    • 2012-08-21
    • 2015-03-17
    • 1970-01-01
    相关资源
    最近更新 更多