成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript:從Callback到Async的發(fā)展過(guò)程——實(shí)例演示

levius / 3520人閱讀

摘要:回調(diào)函數(shù)回調(diào)函數(shù)是將一個(gè)函數(shù)作為參數(shù),傳遞給另一個(gè)函數(shù),然后在外部函數(shù)中調(diào)用該函數(shù)來(lái)完成某種例程或動(dòng)作。案例源碼回調(diào)函數(shù)處理都是基于的發(fā)展利用方法自動(dòng)迭代

閱讀時(shí)間:12 minutes
文章類(lèi)型:理論知識(shí) & 案例演示
案例需求:用JavaScript實(shí)現(xiàn),3個(gè)小球先后運(yùn)動(dòng),完成接力賽跑
案例源碼:見(jiàn)文章最后

引言:

前端開(kāi)發(fā)中,異步處理必不可少;
過(guò)去,我們經(jīng)常用回調(diào)函數(shù)來(lái)完成異步處理,因此也經(jīng)常產(chǎn)生回調(diào)地獄(callback hell);
今天,我們用實(shí)例來(lái)對(duì)比異步處理的方法;
是時(shí)候用async來(lái)處理我們的異步流程了。

Step 1: 回調(diào)函數(shù) Callback
回調(diào)函數(shù): 是將一個(gè)函數(shù)作為參數(shù),傳遞給另一個(gè)函數(shù),然后在外部函數(shù)中調(diào)用該函數(shù)來(lái)完成某種例程或動(dòng)作。

用法:在函數(shù)內(nèi)部調(diào)用函數(shù)

2. 用callback實(shí)現(xiàn)小球移動(dòng)的方法;
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í)行運(yùn)動(dòng);
move(ball1, 200, function () { 
    move(ball2, 400, function () {
        move(ball3, 600, function () {
            alert("callback");
        });
    })
})
Step 2: Promise對(duì)象Promise
Promise: 是一個(gè)返回值的代理,它允許您將處理程序與異步操作的最終成功值或失敗原因相關(guān)聯(lián)。 這使異步方法可以像同步方法那樣返回值:不是立即返回最終值,而是異步方法返回一個(gè)Promise,以便在未來(lái)的某個(gè)時(shí)間點(diǎn)提供該值。

用法:Promise 對(duì)象是由關(guān)鍵字 new 及其構(gòu)造函數(shù)來(lái)創(chuàng)建的。該函數(shù)接收一個(gè)函數(shù)(executor function)作為它的參數(shù)。這個(gè)函數(shù)接受兩個(gè)函數(shù)——resolvereject ——作為其參數(shù)。當(dāng)異步任務(wù)順利完成且返回結(jié)果值時(shí),會(huì)調(diào)用 resolve 函數(shù);而當(dāng)異步任務(wù)失敗且返回失敗原因(通常是一個(gè)錯(cuò)誤對(duì)象)時(shí),會(huì)調(diào)用reject 函數(shù)。

1. 用Promise實(shí)現(xiàn)小球移動(dòng)的方法;
// 讓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í)行運(yùn)動(dòng),調(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對(duì)象 Generator
Generator:生成器函數(shù)在函數(shù)執(zhí)行時(shí)能暫停,還能從暫停處繼續(xù)執(zhí)行,相當(dāng)于將函數(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 為 true   
1. 用Genertor實(shí)現(xiàn)小球移動(dòng)的方法;
// 函數(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í)行運(yùn)動(dòng),需要分布執(zhí)行,但此方法需要手動(dòng)分行執(zhí)行;
let g = m();
g.next(); //讓第一個(gè)小球運(yùn)動(dòng);
g.next(); //讓第二個(gè)小球運(yùn)動(dòng);
g.next(); //讓第三個(gè)小球運(yùn)動(dòng);
3. 使用co庫(kù)迭代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();
    });
}
// 一行代碼實(shí)現(xiàn)函數(shù)執(zhí)行,但是需要引入co庫(kù);
co(m()).then(function () {
    alert("generator");
})
Step 4: async/await函數(shù) async/await
async: 異步函數(shù)聲明定義了一個(gè)異步函數(shù),它返回一個(gè)AsyncFunction對(duì)象。當(dāng)async函數(shù)執(zhí)行,返回一個(gè)Promise對(duì)象;

用法:用async聲明函數(shù),函數(shù)內(nèi)配合await使用。

1. 用 async/await實(shí)現(xiàn)小球移動(dòng)的方法;
// 調(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í)行運(yùn)動(dòng),函數(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é)語(yǔ):
通過(guò)上述4種方法的對(duì)比,我們可以看出JavaScript這門(mén)語(yǔ)言的發(fā)展和進(jìn)步;
ES6+增加了很多實(shí)用功能和方法,將有助于前期代碼的編寫(xiě)以及后期代碼的維護(hù),是時(shí)候用 async/await來(lái)處理我們的異步操作了。
案例源碼:




    
    
    
    Document
    



    

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://hztianpu.com/yun/93442.html

相關(guān)文章

  • [前端工坊]淺談Web編程中異步調(diào)用發(fā)展演變

    摘要:三即生成器,它是生成器函數(shù)返回的一個(gè)對(duì)象,是中提供的一種異步編程解決方案而生成器函數(shù)有兩個(gè)特征,一是函數(shù)名前帶星號(hào),二是內(nèi)部執(zhí)行語(yǔ)句前有關(guān)鍵字調(diào)用一個(gè)生成器函數(shù)并不會(huì)馬上執(zhí)行它里面的語(yǔ)句,而是返回一個(gè)這個(gè)生成器的迭代器對(duì)象。 文章來(lái)自微信公眾號(hào):前端工坊(fe_workshop),不定期更新有趣、好玩的前端相關(guān)原創(chuàng)技術(shù)文章。 如果喜歡,請(qǐng)關(guān)注公眾號(hào):前端工坊版權(quán)歸微信公眾號(hào)所有,轉(zhuǎn)載請(qǐng)...

    qpwoeiru96 評(píng)論0 收藏0
  • 《Node.js設(shè)計(jì)模式》基于ES2015+回調(diào)控制流

    摘要:以下展示它是如何工作的函數(shù)使用構(gòu)造函數(shù)創(chuàng)建一個(gè)新的對(duì)象,并立即將其返回給調(diào)用者。在傳遞給構(gòu)造函數(shù)的函數(shù)中,我們確保傳遞給,這是一個(gè)特殊的回調(diào)函數(shù)。 本系列文章為《Node.js Design Patterns Second Edition》的原文翻譯和讀書(shū)筆記,在GitHub連載更新,同步翻譯版鏈接。 歡迎關(guān)注我的專(zhuān)欄,之后的博文將在專(zhuān)欄同步: Encounter的掘金專(zhuān)欄 知乎專(zhuān)欄...

    LiuRhoRamen 評(píng)論0 收藏0
  • js學(xué)習(xí)之異步處理

    摘要:學(xué)習(xí)開(kāi)發(fā),無(wú)論是前端開(kāi)發(fā)還是都避免不了要接觸異步編程這個(gè)問(wèn)題就和其它大多數(shù)以多線程同步為主的編程語(yǔ)言不同的主要設(shè)計(jì)是單線程異步模型。由于異步編程可以實(shí)現(xiàn)非阻塞的調(diào)用效果,引入異步編程自然就是順理成章的事情了。 學(xué)習(xí)js開(kāi)發(fā),無(wú)論是前端開(kāi)發(fā)還是node.js,都避免不了要接觸異步編程這個(gè)問(wèn)題,就和其它大多數(shù)以多線程同步為主的編程語(yǔ)言不同,js的主要設(shè)計(jì)是單線程異步模型。正因?yàn)閖s天生的與...

    VioletJack 評(píng)論0 收藏0
  • ES6-7

    摘要:的翻譯文檔由的維護(hù)很多人說(shuō),阮老師已經(jīng)有一本關(guān)于的書(shū)了入門(mén),覺(jué)得看看這本書(shū)就足夠了。前端的異步解決方案之和異步編程模式在前端開(kāi)發(fā)過(guò)程中,顯得越來(lái)越重要。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(shū)(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書(shū)的目的是以目前還在制定中的ECMASc...

    mudiyouyou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<