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

資訊專欄INFORMATION COLUMN

支持Promise的Generator Runner

hellowoody / 1927人閱讀

摘要:為了更斜體文字好的理解生成器協同運作模式,自己自定義一個獨立工具,它會自動異步運行傳遞給它的生成器,直到結束把基于回調的代碼轉換為基于的代碼測試拋出異常后是否繼續執行

為了更斜體文字好的理解生成器+Promise協同運作模式,自己自定義一個獨立工具run(..),它會自動異步運行傳遞給它的生成器,直到結束

----------
Examples:
    // 把基于回調的代碼轉換為基于Promise的代碼:
    if(!Promise.wrap) {
        Promise.wrap = function(fn) {
            return function() {
                var args = [].slice.call(arguments);
                return new Promise((resolve, reject) => {
                    fn.apply(null, args.concat(function(err, data) {
                        if(err) {
                            reject(err);
                        }else {
                            resolve(data);
                        }
                    }));
                });
            };
        };
    }
    
    function calc(x, y, cb) {
        var sum = x + y;
        if(sum < 10) {
            cb(null, sum);
        }else {
            cb(new Error("stack overflow"));
        }
    }
    
    // Generator Runner
    function run(gen) {
        var args = [].slice.call(arguments, 1);
        var it = gen.apply(this, args);
        return Promise.resolve().then(function handleNext(val) {
            var next = it.next(val);
            
            return (function handleResult(next) {
                if(next.done) {
                    return next.value;
                }else {
                    return Promise.resolve(next.value).then(handleNext, function handleError(err) {
                        return Promise.resolve(it.throw(err)).then(handleResult);
                    });
                }
            })(next);
        });
    }
    
    function* gen() {
        try {
            var res1 = yield Promise.wrap(calc)(1, 2);
            console.log("res1: ", res1);
            
            var res2 = yield Promise.wrap(calc)(5, 6);
            console.log("res2: ", res2);
        } catch(e) {
            console.error(e);
        }
        
        // 測試拋出異常后是否繼續執行
        var res3 = yield Promise.wrap(calc)(3, 4);
        console.log("res3: ", res3);
        
        return "the end";
    }
    
    run(gen).then(val => console.log(val), err => console.error(err));


console output:
res1:  3
Error: stack overflow(…)
res3:  7
the end

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

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

相關文章

  • JavaScript異步編程:Generator與Async

    摘要:從開始,就在引入新功能,來幫助更簡單的方法來處理異步編程,幫助我們遠離回調地獄。而則是為了更簡潔的使用而提出的語法,相比這種的實現方式,更為專注,生來就是為了處理異步編程。 從Promise開始,JavaScript就在引入新功能,來幫助更簡單的方法來處理異步編程,幫助我們遠離回調地獄。 Promise是下邊要講的Generator/yield與async/await的基礎,希望你已...

    leon 評論0 收藏0
  • 通過ES6 Generator函數實現異步流程

    摘要:換句話說,我們很好的對代碼的功能關注點進行了分離通過將使用消費值得地方函數中的邏輯和通過異步流程來獲取值迭代器的方法進行了有效的分離。但是現在我們通過來管理代碼的異步流程部分,我們解決了回調函數所帶來的反轉控制等問題。 本文翻譯自 Going Async With ES6 Generators 由于個人能力知識有限,翻譯過程中難免有紕漏和錯誤,還望指正Issue ES6 Gener...

    劉厚水 評論0 收藏0
  • ES6常用知識學習札記

    摘要:在年正式發布了,簡稱,又稱為。再次簡寫循環迭代數組每個元素都執行一次回調函數。方法用于調用數組的每個元素,并將元素傳遞給回調函數。注意對于空數組是不會執行回調函數的。 轉載請注明出處 原文連接 http://blog.huanghanlian.com/article/5c7aa6c7bf3acc0864870f9d es6 是什么 首先弄明白ECMA和js的關系。ECMA是標準,Jav...

    googollee 評論0 收藏0
  • ES6常用知識學習札記

    摘要:在年正式發布了,簡稱,又稱為。再次簡寫循環迭代數組每個元素都執行一次回調函數。方法用于調用數組的每個元素,并將元素傳遞給回調函數。注意對于空數組是不會執行回調函數的。 轉載請注明出處 原文連接 http://blog.huanghanlian.com/article/5c7aa6c7bf3acc0864870f9d es6 是什么 首先弄明白ECMA和js的關系。ECMA是標準,Jav...

    tracymac7 評論0 收藏0
  • ES6 Generator實現協同程序

    摘要:關鍵字表示代碼在該處將會被阻塞式暫停阻塞的僅僅是函數代碼本身,而不是整個程序,但是這并沒有引起函數內部自頂向下代碼的絲毫改變。通過實現模式在通過實現理論的過程中已經有一些有趣的探索了。 至此本系列的四篇文章翻譯完結,查看完整系列請移步blogs 由于個人能力知識有限,翻譯過程中難免有紕漏和錯誤,望不吝指正issue ES6 Generators: 完整系列 The Basics...

    MudOnTire 評論0 收藏0

發表評論

0條評論

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