摘要:為了更斜體文字好的理解生成器協(xié)同運(yùn)作模式,自己自定義一個(gè)獨(dú)立工具,它會(huì)自動(dòng)異步運(yùn)行傳遞給它的生成器,直到結(jié)束把基于回調(diào)的代碼轉(zhuǎn)換為基于的代碼測試拋出異常后是否繼續(xù)執(zhí)行
為了更斜體文字好的理解生成器+Promise協(xié)同運(yùn)作模式,自己自定義一個(gè)獨(dú)立工具run(..),它會(huì)自動(dòng)異步運(yùn)行傳遞給它的生成器,直到結(jié)束
---------- Examples: // 把基于回調(diào)的代碼轉(zhuǎn)換為基于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); } // 測試拋出異常后是否繼續(xù)執(zhí)行 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
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/107047.html
摘要:從開始,就在引入新功能,來幫助更簡單的方法來處理異步編程,幫助我們遠(yuǎn)離回調(diào)地獄。而則是為了更簡潔的使用而提出的語法,相比這種的實(shí)現(xiàn)方式,更為專注,生來就是為了處理異步編程。 從Promise開始,JavaScript就在引入新功能,來幫助更簡單的方法來處理異步編程,幫助我們遠(yuǎn)離回調(diào)地獄。 Promise是下邊要講的Generator/yield與async/await的基礎(chǔ),希望你已...
摘要:換句話說,我們很好的對代碼的功能關(guān)注點(diǎn)進(jìn)行了分離通過將使用消費(fèi)值得地方函數(shù)中的邏輯和通過異步流程來獲取值迭代器的方法進(jìn)行了有效的分離。但是現(xiàn)在我們通過來管理代碼的異步流程部分,我們解決了回調(diào)函數(shù)所帶來的反轉(zhuǎn)控制等問題。 本文翻譯自 Going Async With ES6 Generators 由于個(gè)人能力知識(shí)有限,翻譯過程中難免有紕漏和錯(cuò)誤,還望指正Issue ES6 Gener...
摘要:在年正式發(fā)布了,簡稱,又稱為。再次簡寫循環(huán)迭代數(shù)組每個(gè)元素都執(zhí)行一次回調(diào)函數(shù)。方法用于調(diào)用數(shù)組的每個(gè)元素,并將元素傳遞給回調(diào)函數(shù)。注意對于空數(shù)組是不會(huì)執(zhí)行回調(diào)函數(shù)的。 轉(zhuǎn)載請注明出處 原文連接 http://blog.huanghanlian.com/article/5c7aa6c7bf3acc0864870f9d es6 是什么 首先弄明白ECMA和js的關(guān)系。ECMA是標(biāo)準(zhǔn),Jav...
摘要:在年正式發(fā)布了,簡稱,又稱為。再次簡寫循環(huán)迭代數(shù)組每個(gè)元素都執(zhí)行一次回調(diào)函數(shù)。方法用于調(diào)用數(shù)組的每個(gè)元素,并將元素傳遞給回調(diào)函數(shù)。注意對于空數(shù)組是不會(huì)執(zhí)行回調(diào)函數(shù)的。 轉(zhuǎn)載請注明出處 原文連接 http://blog.huanghanlian.com/article/5c7aa6c7bf3acc0864870f9d es6 是什么 首先弄明白ECMA和js的關(guān)系。ECMA是標(biāo)準(zhǔn),Jav...
摘要:關(guān)鍵字表示代碼在該處將會(huì)被阻塞式暫停阻塞的僅僅是函數(shù)代碼本身,而不是整個(gè)程序,但是這并沒有引起函數(shù)內(nèi)部自頂向下代碼的絲毫改變。通過實(shí)現(xiàn)模式在通過實(shí)現(xiàn)理論的過程中已經(jīng)有一些有趣的探索了。 至此本系列的四篇文章翻譯完結(jié),查看完整系列請移步blogs 由于個(gè)人能力知識(shí)有限,翻譯過程中難免有紕漏和錯(cuò)誤,望不吝指正issue ES6 Generators: 完整系列 The Basics...
閱讀 3434·2021-11-08 13:20
閱讀 3359·2021-09-30 09:48
閱讀 2560·2021-09-29 09:41
閱讀 589·2021-09-22 15:04
閱讀 2458·2021-08-23 09:44
閱讀 3663·2020-12-03 17:26
閱讀 1007·2019-08-30 14:10
閱讀 1561·2019-08-29 18:34