利用es6的async函數(shù),編寫動畫順序執(zhí)行代碼

今日天氣比較冷,辦公室氛圍也冷了下來,難得的安靜氛圍,終于平息了往日的喧鬧。

于是乎,我看了一下es6的async函數(shù)章節(jié),學(xué)習(xí)一下新的知識。此篇文章用以記錄 async 函數(shù)的實現(xiàn)原理。

翻到了 async 函數(shù)的實現(xiàn)原理 小節(jié),其中文中有個用以部署一系列的動畫的例子,讓我心動不已。據(jù)文章所述,該例子可解決平日里讓我懊惱的尷尬問題:怎么優(yōu)雅地編寫多個動畫順序執(zhí)行代碼(不要寫一大堆嵌套的回調(diào)那種)。

但是es6入門書籍里面的例子是偽代碼例子,可能需要轉(zhuǎn)些彎才行,因此下面會給出一個模擬動畫的真實案例:

思路便是拿定時器來開刀:


var anim = function (ms) {

    return new Promise((resolve, reject) => {

        setTimeout(() => {

            resolve(ms);

        }, ms);

    });

};

async function chainAnim (animations) {

    let ret = null;

    for (let an of animations) {

        ret = await anim(an);

        console.log(an);

    }

    return ret;

}

let res = chainAnim([1000, 2000, 3000]);

執(zhí)行以上代碼,講道理就會:等待一秒,輸出1000,再等待兩秒,輸出2000,最后,等待三秒,輸出3000。

這樣子把定時器想象成動畫的持續(xù)時間,其實就已經(jīng)實現(xiàn)了動畫的按順序執(zhí)行,且可以監(jiān)聽到整個動畫的最終完成回調(diào),即名為'3000'的動畫。


res.then(r => {

    console.log('最后一個動畫是:' + r + ' 完成了。');

});

好了,至此案例結(jié)束,是不是簡單易用?比嵌套的回調(diào)寫法要好多了。

總結(jié):其實案例的精髓之處還是得歸功于es6的async函數(shù),特別是await,顧名思義--“掛起”,先“掛起”不執(zhí)行,接收到“命令”后再執(zhí)行。本人對es6也并不是研究很深,如果對async,await語法不了解的,可以前往阮一峰大神的es6入門站點去查閱一番。-----------至此共勉-----------

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容