国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript:從Callback到Async的發展過程——實例演示

levius / 3452人閱讀

摘要:回調函數回調函數是將一個函數作為參數,傳遞給另一個函數,然后在外部函數中調用該函數來完成某種例程或動作。案例源碼回調函數處理都是基于的發展利用方法自動迭代

閱讀時間:12 minutes
文章類型:理論知識 & 案例演示
案例需求:用JavaScript實現,3個小球先后運動,完成接力賽跑
案例源碼:見文章最后

引言:

前端開發中,異步處理必不可少;
過去,我們經常用回調函數來完成異步處理,因此也經常產生回調地獄(callback hell);
今天,我們用實例來對比異步處理的方法;
是時候用async來處理我們的異步流程了。

Step 1: 回調函數 Callback
回調函數: 是將一個函數作為參數,傳遞給另一個函數,然后在外部函數中調用該函數來完成某種例程或動作。

用法:在函數內部調用函數

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

用法:Promise 對象是由關鍵字 new 及其構造函數來創建的。該函數接收一個函數(executor function)作為它的參數。這個函數接受兩個函數——resolvereject ——作為其參數。當異步任務順利完成且返回結果值時,會調用 resolve 函數;而當異步任務失敗且返回失敗原因(通常是一個錯誤對象)時,會調用reject 函數。

1. 用Promise實現小球移動的方法;
// 讓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. 執行運動,調用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:生成器函數在函數執行時能暫停,還能從暫停處繼續執行,相當于將函數分段執行。

用法:必須用.next()配合 yield關鍵字使用;例如:

function *gen(){
yield 10;
y=yield "foo";
yield y;
}
var gen_obj=gen();
console.log(gen_obj.next());    // 執行 yield 10,返回 10
console.log(gen_obj.next());    // 執行 yield "foo",返回 "foo"
console.log(gen_obj.next(10));  // 將 10 賦給上一條 yield "foo" 的左值,即執行 y=10,返回 10
console.log(gen_obj.next());    // 執行完畢,value 為 undefined,done 為 true   
1. 用Genertor實現小球移動的方法;
// 函數move方法調用上面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. 執行運動,需要分布執行,但此方法需要手動分行執行;
let g = m();
g.next(); //讓第一個小球運動;
g.next(); //讓第二個小球運動;
g.next(); //讓第三個小球運動;
3. 使用co庫迭代generator執行器;
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();
    });
}
// 一行代碼實現函數執行,但是需要引入co庫;
co(m()).then(function () {
    alert("generator");
})
Step 4: async/await函數 async/await
async: 異步函數聲明定義了一個異步函數,它返回一個AsyncFunction對象。當async函數執行,返回一個Promise對象;

用法:用async聲明函數,函數內配合await使用。

1. 用 async/await實現小球移動的方法;
// 調用上面的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. 執行運動,函數內await方法;
async function a() {
    await move(ball1, 200);
    await move(ball2, 400);
    await move(ball3, 600);
}
a().then(function () {
    alert("async")
})
結語:
通過上述4種方法的對比,我們可以看出JavaScript這門語言的發展和進步;
ES6+增加了很多實用功能和方法,將有助于前期代碼的編寫以及后期代碼的維護,是時候用 async/await來處理我們的異步操作了。
案例源碼:




    
    
    
    Document
    



    

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93442.html

相關文章

  • [前端工坊]淺談Web編程中異步調用發展演變

    摘要:三即生成器,它是生成器函數返回的一個對象,是中提供的一種異步編程解決方案而生成器函數有兩個特征,一是函數名前帶星號,二是內部執行語句前有關鍵字調用一個生成器函數并不會馬上執行它里面的語句,而是返回一個這個生成器的迭代器對象。 文章來自微信公眾號:前端工坊(fe_workshop),不定期更新有趣、好玩的前端相關原創技術文章。 如果喜歡,請關注公眾號:前端工坊版權歸微信公眾號所有,轉載請...

    qpwoeiru96 評論0 收藏0
  • 《Node.js設計模式》基于ES2015+回調控制流

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

    LiuRhoRamen 評論0 收藏0
  • js學習之異步處理

    摘要:學習開發,無論是前端開發還是都避免不了要接觸異步編程這個問題就和其它大多數以多線程同步為主的編程語言不同的主要設計是單線程異步模型。由于異步編程可以實現非阻塞的調用效果,引入異步編程自然就是順理成章的事情了。 學習js開發,無論是前端開發還是node.js,都避免不了要接觸異步編程這個問題,就和其它大多數以多線程同步為主的編程語言不同,js的主要設計是單線程異步模型。正因為js天生的與...

    VioletJack 評論0 收藏0
  • ES6-7

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

    mudiyouyou 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<