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

第二次调用 Promise 无法解决

第二次调用 Promise 无法解决

杨魅力 2024-01-22 14:31:01
我有以下功能。我将该函数构建为promise. 现在,如果我aboutMove().then(() => {..})第一次打电话,一切正常并且正在解决。不知何故,稍后在其他地方第二次调用它,该函数将被执行,但未promise解析。为何如此?export const aboutMove = () => {    return new Promise(resolve => {        if (didAboutMove && aboutAnimation) {            aboutAnimation.reverse();            didAboutMove = !didAboutMove;            return;        }        didAboutMove = !didAboutMove;        const about = document.querySelector('.about__container');        const inner = document.querySelector('.about__inner');        aboutAnimation = gsap.timeline({            onComplete: () => {                resolve()            }, onReverseComplete: () => {                resolve()            }        })            .to(about, 1, {                duration: 1,                y: 0,                ease: Power2.easeInOut,            })            .fromTo(inner, {                opacity: 0,                y: 500            }, {                duration: 0.8,                opacity: 1,                y: 0,                ease: Power2.easeInOut            }, 0.5)    });};
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

你没有返回相同的Promise。每次调用时,您都会创建一个新的aboutMove。


考虑这段代码


if (didAboutMove && aboutAnimation) {

  aboutAnimation.reverse();

  didAboutMove = !didAboutMove;

  return;

}

如果didAboutMove和aboutAnimation都为真,您将退出承诺初始化器并且永远不会解决承诺。


在调用此方法之前,您很可能需要重置这两个标志。


查看完整回答
反对 回复 2024-01-22
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

你正在兑现你的承诺,onComplete并onReverseComplete为之gsap.timeline。此外,您将从 Promise 函数的回调中返回, didAboutMove && aboutAnimation该函数的作用域不在函数内部。因此,当您第一次调用该函数时。它设置了值didAboutMove,aboutAnimation所以下次调用解析不会被触发。因为函数之前返回。


if (didAboutMove && aboutAnimation) {

   // This block will execute in second run.

    aboutAnimation.reverse();

    didAboutMove = !didAboutMove;

    return; // Returns from here in second run.

}

didAboutMove = !didAboutMove; // assigned truthy value on first run

aboutAnimation = gsap.timeline // assigned truthy value on first run


查看完整回答
反对 回复 2024-01-22
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

当你第二次调用它时,didAboutMove标志将为 true,并且你输入 if 块,它只是返回而不解决承诺:


if (didAboutMove && aboutAnimation) {

    aboutAnimation.reverse();

    didAboutMove = !didAboutMove;

    return; // This is the problem

}

因此,您需要通过解决或拒绝来解决承诺。然而,从你的逻辑来看,你只想反转动画,所以也许你不需要返回任何东西。


查看完整回答
反对 回复 2024-01-22
  • 3 回答
  • 0 关注
  • 43 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信