async/await在CSS動(dòng)畫(huà)控制中的簡(jiǎn)單應(yīng)用

最近在做一個(gè)H5動(dòng)畫(huà)的小項(xiàng)目樟插,由于項(xiàng)目周期充裕,前期主要是搭架構(gòu)竿刁,也沒(méi)用其他多余的動(dòng)畫(huà)庫(kù)黄锤。由于經(jīng)驗(yàn)不足,在搭架構(gòu)的過(guò)程中也遇到挺多坑食拜,比如webpack的配置問(wèn)題鸵熟、場(chǎng)景動(dòng)畫(huà)類的封裝等等。這次就記錄下如何異步控制動(dòng)畫(huà)的出現(xiàn)和消失负甸。

回顧ES6的Promise和ES7的async/await

在ES6出來(lái)之前和不用其他動(dòng)畫(huà)庫(kù)的情況下流强,很多人做簡(jiǎn)單動(dòng)畫(huà)基本都是用css3 animation + setTimeout + jQuery animate,但這樣卻面臨一個(gè)問(wèn)題:沒(méi)錯(cuò)呻待,回調(diào)地獄和嵌套層次太深打月,代碼可讀性大打折扣。
但現(xiàn)在有了ES6蚕捉、ES7和babel奏篙,我們可以大膽地用promise和async/await來(lái)做動(dòng)畫(huà)的異步執(zhí)行。
async函數(shù)是generator的一個(gè)語(yǔ)法糖迫淹,目前能被babel編譯秘通。它的優(yōu)點(diǎn)在于外部不需要手動(dòng)調(diào)用next方法,也不需要鏈?zhǔn)秸{(diào)用then方法敛熬,可以說(shuō)是優(yōu)于promise和generator肺稀。用法非常簡(jiǎn)單,來(lái)看一個(gè)簡(jiǎn)單例子:

const getUserData = url => (
    new Promise((resolve, reject) => {
       axios.get(url)
         .then(({ data }) => resolve(data))
         .catch(error => reject(error));
    })
);
const getUserDataByAsync = async () => {
    let _username;
    try{
      const { username } = await getUserData('https://github.com/username');
      _username = username;
      if(_username) {
        /* do something */
      }
    }catch(err){
      console.log(err);
    }
};
getUserDataByAsync();
  • 首先我們定義了一個(gè)getUserData函數(shù)应民,返回一個(gè)promise對(duì)象實(shí)例盹靴,用于抓取github上的用戶信息。axios的get方法返回的也是一個(gè)promise對(duì)象瑞妇,請(qǐng)求成功后會(huì)執(zhí)行第一層promise的resolve方法,并把請(qǐng)求到的數(shù)據(jù)傳出去梭冠。
  • 接下來(lái)定義一個(gè)名為getUserDataByAsync的async函數(shù)(也可以這么聲明: async function getUserDataByAsync(){})辕狰,用于處理請(qǐng)求成功后的操作。await關(guān)鍵字后調(diào)用getUserData控漠,而在此之后的代碼(在try之內(nèi)蔓倍,await之后)則會(huì)被阻塞悬钳,待請(qǐng)求成功后才會(huì)繼續(xù)執(zhí)行。await getUserData()的返回值則是getUserData函數(shù)里resolve后傳入的data偶翅。這里我們用try-catch來(lái)捕獲請(qǐng)求失敗后的異常信息默勾,catch打印出來(lái)的則是getUserData里請(qǐng)求失敗后reject傳入的error。
  • 最后再調(diào)用getUserDataByAsync函數(shù)就行了聚谁。
我們用同樣的方法封裝一個(gè)動(dòng)畫(huà)延時(shí)器
  • 首先我們先封裝動(dòng)畫(huà)方法母剥,這里為了操作節(jié)點(diǎn)方便一點(diǎn)用了jQuery
const animate = several => {
     for (let effectName in several) {
       let effect = `${effectName}`,
           element_list = (several[effectName] instanceof Array) ? several[effectName] : [];

       element_list.forEach(element => {
         //為了防止display和animation沖突我們需要判斷元素是否被隱藏了
         if ($(element).is(':hidden')) {
           $(element).show();
           setTimeout(() => {
             $(element).addClass(`animated ${effect}`);
           }, 10);
         } else {
           $(element).addClass(`animated ${effect}`);
         }
       });
     }
};

需配合自己寫(xiě)的css3 animation或引入animate.css庫(kù)。

  • 再封裝一個(gè)延時(shí)器
const delay = (timeout = 0) => (
    new Promise(resolve => {
      setTimeout(resolve, timeout);
    })
);
  • 之后就可以隨意控制動(dòng)畫(huà)的出現(xiàn)和消失了
const pageAnimationStart = async () => {
    const _sceneWrap= $('#scene-wrap'),
          _title = _scene_wrap.find('.title'),
          _tree =  _scene_wrap.find('.tree'),
          _apples = _scene_wrap.find('.apple');

    animate({
      'scaleIn': [_sceneWrap]
    });

    await delay(1000);

    animate({
      'slideBounceInDown': [_tree]
    });

    await delay(1500);

    animate({
      'bounceIn': [_title, _apples]
    });
};
window.addEventListener('load', function(){
    pageAnimationStart();
}, false);

頁(yè)面加載完成后形导,場(chǎng)景開(kāi)始环疼,先是整個(gè)場(chǎng)景背景_sceneWrap放大進(jìn)入,1秒后大樹(shù)_tree由上到下掉入朵耕,再過(guò)1.5秒后標(biāo)題_title和蘋(píng)果_apples跳入炫隶。
大概就是這樣一個(gè)步奏,以異步執(zhí)行阎曹、同步寫(xiě)法的方式伪阶,看起來(lái)特別舒服,清晰地展示了每一步該做什么处嫌,避免了的嵌套栅贴、回調(diào)和滿屏的then方法。

這就是async/await在動(dòng)畫(huà)處理中的簡(jiǎn)單方法锰霜。其他應(yīng)用場(chǎng)景等我研究過(guò)后再記錄吧!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末筹误,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子癣缅,更是在濱河造成了極大的恐慌厨剪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件友存,死亡現(xiàn)場(chǎng)離奇詭異祷膳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)屡立,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)直晨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人膨俐,你說(shuō)我怎么就攤上這事勇皇。” “怎么了焚刺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵敛摘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我乳愉,道長(zhǎng)兄淫,這世上最難降的妖魔是什么屯远? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮捕虽,結(jié)果婚禮上慨丐,老公的妹妹穿的比我還像新娘。我一直安慰自己泄私,他們只是感情好房揭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著挖滤,像睡著了一般崩溪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斩松,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天伶唯,我揣著相機(jī)與錄音,去河邊找鬼惧盹。 笑死乳幸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钧椰。 我是一名探鬼主播粹断,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嫡霞!你這毒婦竟也來(lái)了瓶埋?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诊沪,失蹤者是張志新(化名)和其女友劉穎养筒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體端姚,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晕粪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渐裸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巫湘。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昏鹃,靈堂內(nèi)的尸體忽然破棺而出砂豌,到底是詐尸還是另有隱情粤攒,我是刑警寧澤崎逃,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布愿阐,位于F島的核電站燃辖,受9級(jí)特大地震影響蟹腾,放射性物質(zhì)發(fā)生泄漏膀跌。R本人自食惡果不足惜芍躏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宪巨。 院中可真熱鬧磷杏,春花似錦、人聲如沸捏卓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)怠晴。三九已至遥金,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒜田,已是汗流浹背稿械。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冲粤,地道東北人美莫。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像梯捕,于是被迫代替她去往敵國(guó)和親厢呵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 異步編程對(duì)JavaScript語(yǔ)言太重要傀顾。Javascript語(yǔ)言的執(zhí)行環(huán)境是“單線程”的襟铭,如果沒(méi)有異步編程,根本...
    呼呼哥閱讀 7,301評(píng)論 5 22
  • javascript的運(yùn)行機(jī)制是單線程處理入撒,即只有上一個(gè)任務(wù)完成后,才會(huì)執(zhí)行下一個(gè)任務(wù)椭岩,這種機(jī)制也被稱為“同步”茅逮。...
    我是xy閱讀 3,876評(píng)論 1 6
  • 簡(jiǎn)單介紹下這幾個(gè)的關(guān)系為方便起見(jiàn) 用以下代碼為例簡(jiǎn)單介紹下這幾個(gè)東西的關(guān)系, async 在函數(shù)聲明前使用asyn...
    _我和你一樣閱讀 21,215評(píng)論 1 24
  • 相對(duì)于回調(diào)函數(shù)來(lái)說(shuō)判哥,Promise是一種相對(duì)優(yōu)雅的選擇献雅。那么有沒(méi)有更好的方案呢?答案就是async/await塌计。優(yōu)...
    勇往直前888閱讀 47,171評(píng)論 8 36
  • ·楔子求求你挺身,求求你,留下來(lái)锌仅。不見(jiàn)了章钾。 ·節(jié)一人生如夢(mèng)墙贱,一樽還酹江月。我的人生就恍若一場(chǎng)夢(mèng)贱傀,而夢(mèng)中卻沒(méi)有你惨撇。即使我...
    勇猛的野鴨閱讀 372評(píng)論 0 1