摘要:回調(diào)函數(shù)回調(diào)函數(shù)是將一個函數(shù)作為參數(shù),傳遞給另一個函數(shù),然后在外部函數(shù)中調(diào)用該函數(shù)來完成某種例程或動作。案例源碼回調(diào)函數(shù)處理都是基于的發(fā)展利用方法自動迭代
Step 1: 回調(diào)函數(shù) Callback閱讀時間:12 minutes
引言:
文章類型:理論知識 & 案例演示
案例需求:用JavaScript實現(xiàn),3個小球先后運動,完成接力賽跑
案例源碼:見文章最后前端開發(fā)中,異步處理必不可少;
過去,我們經(jīng)常用回調(diào)函數(shù)來完成異步處理,因此也經(jīng)常產(chǎn)生回調(diào)地獄(callback hell);
今天,我們用實例來對比異步處理的方法;
是時候用async來處理我們的異步流程了。
回調(diào)函數(shù): 是將一個函數(shù)作為參數(shù),傳遞給另一個函數(shù),然后在外部函數(shù)中調(diào)用該函數(shù)來完成某種例程或動作。2. 用callback實現(xiàn)小球移動的方法;用法:在函數(shù)內(nèi)部調(diào)用函數(shù)
function move(ele, target, callback) { let left = parseInt(getComputedStyle(ele)["left"]); let timer = setInterval(function () { if (left >= target) { clearInterval(timer); callback(); } else { left += 2; ele.style.left = left + "px"; } }, 4) }2. 執(zhí)行運動;
move(ball1, 200, function () { move(ball2, 400, function () { move(ball3, 600, function () { alert("callback"); }); }) })Step 2: Promise對象Promise
Promise: 是一個返回值的代理,它允許您將處理程序與異步操作的最終成功值或失敗原因相關(guān)聯(lián)。 這使異步方法可以像同步方法那樣返回值:不是立即返回最終值,而是異步方法返回一個Promise,以便在未來的某個時間點提供該值。1. 用Promise實現(xiàn)小球移動的方法;用法:Promise 對象是由關(guān)鍵字 new 及其構(gòu)造函數(shù)來創(chuàng)建的。該函數(shù)接收一個函數(shù)(executor function)作為它的參數(shù)。這個函數(shù)接受兩個函數(shù)——resolve 和 reject ——作為其參數(shù)。當異步任務(wù)順利完成且返回結(jié)果值時,會調(diào)用 resolve 函數(shù);而當異步任務(wù)失敗且返回失敗原因(通常是一個錯誤對象)時,會調(diào)用reject 函數(shù)。
// 讓move方法擁有Promise功能 function move(ele, target) { return new Promise(function (resolve, reject) { let left = parseInt(getComputedStyle(ele)["left"]); let timer = setInterval(function () { if (left >= target) { clearInterval(timer); resolve(); } else { left += 2; ele.style.left = left + "px"; } }, 4) }) }2. 執(zhí)行運動,調(diào)用Promise.then()方法;
move(ball1, 200).then(function () { return move(ball2, 400); }).then(function () { return move(ball3, 600); }).then(function () { alert("promise"); })Step 3: Generator對象 Generator
Generator:生成器函數(shù)在函數(shù)執(zhí)行時能暫停,還能從暫停處繼續(xù)執(zhí)行,相當于將函數(shù)分段執(zhí)行。用法:必須用.next()配合 yield關(guān)鍵字使用;例如:
function *gen(){ yield 10; y=yield "foo"; yield y; } var gen_obj=gen(); console.log(gen_obj.next()); // 執(zhí)行 yield 10,返回 10 console.log(gen_obj.next()); // 執(zhí)行 yield "foo",返回 "foo" console.log(gen_obj.next(10)); // 將 10 賦給上一條 yield "foo" 的左值,即執(zhí)行 y=10,返回 10 console.log(gen_obj.next()); // 執(zhí)行完畢,value 為 undefined,done 為 true1. 用Genertor實現(xiàn)小球移動的方法;
// 函數(shù)move方法調(diào)用上面Promise中的move方法; function move(ele, target) { return new Promise(function (resolve, reject) { let left = parseInt(getComputedStyle(ele)["left"]); let timer = setInterval(function () { if (left >= target) { clearInterval(timer); resolve(); } else { left += 2; ele.style.left = left + "px"; } }, 4) }) }2. 執(zhí)行運動,需要分布執(zhí)行,但此方法需要手動分行執(zhí)行;
let g = m(); g.next(); //讓第一個小球運動; g.next(); //讓第二個小球運動; g.next(); //讓第三個小球運動;3. 使用co庫迭代generator執(zhí)行器;
function co(it) { return new Promise(function (resolve, reject) { function next(d) { let { value, done } = it.next(d); if (!done) { value.then(function (data) { next(data) }, reject) } else { resolve(value); } }; next(); }); } // 一行代碼實現(xiàn)函數(shù)執(zhí)行,但是需要引入co庫; co(m()).then(function () { alert("generator"); })Step 4: async/await函數(shù) async/await
async: 異步函數(shù)聲明定義了一個異步函數(shù),它返回一個AsyncFunction對象。當async函數(shù)執(zhí)行,返回一個Promise對象;1. 用 async/await實現(xiàn)小球移動的方法;用法:用async聲明函數(shù),函數(shù)內(nèi)配合await使用。
// 調(diào)用上面的move()方法; function move(ele, target) { return new Promise(function (resolve, reject) { let left = parseInt(getComputedStyle(ele)["left"]); let timer = setInterval(function () { if (left >= target) { clearInterval(timer); resolve(); } else { left += 2; ele.style.left = left + "px"; } }, 4) }) }2. 執(zhí)行運動,函數(shù)內(nèi)await方法;
async function a() { await move(ball1, 200); await move(ball2, 400); await move(ball3, 600); } a().then(function () { alert("async") })結(jié)語:
通過上述4種方法的對比,我們可以看出JavaScript這門語言的發(fā)展和進步;
ES6+增加了很多實用功能和方法,將有助于前期代碼的編寫以及后期代碼的維護,是時候用 async/await來處理我們的異步操作了。
案例源碼:
Document
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93442.html
摘要:三即生成器,它是生成器函數(shù)返回的一個對象,是中提供的一種異步編程解決方案而生成器函數(shù)有兩個特征,一是函數(shù)名前帶星號,二是內(nèi)部執(zhí)行語句前有關(guān)鍵字調(diào)用一個生成器函數(shù)并不會馬上執(zhí)行它里面的語句,而是返回一個這個生成器的迭代器對象。 文章來自微信公眾號:前端工坊(fe_workshop),不定期更新有趣、好玩的前端相關(guān)原創(chuàng)技術(shù)文章。 如果喜歡,請關(guān)注公眾號:前端工坊版權(quán)歸微信公眾號所有,轉(zhuǎn)載請...
摘要:以下展示它是如何工作的函數(shù)使用構(gòu)造函數(shù)創(chuàng)建一個新的對象,并立即將其返回給調(diào)用者。在傳遞給構(gòu)造函數(shù)的函數(shù)中,我們確保傳遞給,這是一個特殊的回調(diào)函數(shù)。 本系列文章為《Node.js Design Patterns Second Edition》的原文翻譯和讀書筆記,在GitHub連載更新,同步翻譯版鏈接。 歡迎關(guān)注我的專欄,之后的博文將在專欄同步: Encounter的掘金專欄 知乎專欄...
摘要:學(xué)習(xí)開發(fā),無論是前端開發(fā)還是都避免不了要接觸異步編程這個問題就和其它大多數(shù)以多線程同步為主的編程語言不同的主要設(shè)計是單線程異步模型。由于異步編程可以實現(xiàn)非阻塞的調(diào)用效果,引入異步編程自然就是順理成章的事情了。 學(xué)習(xí)js開發(fā),無論是前端開發(fā)還是node.js,都避免不了要接觸異步編程這個問題,就和其它大多數(shù)以多線程同步為主的編程語言不同,js的主要設(shè)計是單線程異步模型。正因為js天生的與...
摘要:的翻譯文檔由的維護很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...
閱讀 1776·2021-11-11 16:55
閱讀 2579·2021-08-27 13:11
閱讀 3635·2019-08-30 15:53
閱讀 2309·2019-08-30 15:44
閱讀 1399·2019-08-30 11:20
閱讀 1047·2019-08-30 10:55
閱讀 952·2019-08-29 18:40
閱讀 3045·2019-08-29 16:13