亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

第二次調用 promise 將無法解決

第二次調用 promise 將無法解決

慕絲7291255 2022-07-08 18:25:29
我有以下功能。我將函數構建為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 回答

?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

當您第二次調用它時,該didAboutMove標志將為真,然后您進入 if 塊,該塊只是返回而不解析承諾:


if (didAboutMove && aboutAnimation) {

    aboutAnimation.reverse();

    didAboutMove = !didAboutMove;

    return; // This is the problem

}

因此,您需要通過解決或拒絕它來解決承諾。但是,從您的邏輯來看,您只是打算反轉動畫,所以也許您根本不需要返回任何東西。


查看完整回答
反對 回復 2022-07-08
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

你正在解決你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


查看完整回答
反對 回復 2022-07-08
?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

你沒有返回相同的Promise。每次調用時,您都在創建一個新的aboutMove。


考慮到這段代碼


if (didAboutMove && aboutAnimation) {

  aboutAnimation.reverse();

  didAboutMove = !didAboutMove;

  return;

}

如果didAboutMove和aboutAnimation都為真,您將退出承諾初始化程序并且永遠不會解決承諾。


您很可能需要在調用此方法之前重置這兩個標志。


查看完整回答
反對 回復 2022-07-08
  • 3 回答
  • 0 關注
  • 266 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號