摘要:參數(shù)數(shù)組中的任何一個對象如果變?yōu)榛蛘叩脑挘摵瘮?shù)就會返回,并使用這個對象的值進(jìn)行或者。并沒有執(zhí)行進(jìn)入后,依舊會執(zhí)行并不會被住。發(fā)生,不會執(zhí)行,會直接到中,由于在和后面沒有處理了,因此在這兩個中如果出現(xiàn)異常的話將不會被捕獲只會出現(xiàn)以下
ES6 Generator/Promise Generator
node -harmony app.js (harmony 告訴Node使用ES6來運行)
next 方法的參數(shù)表示上一個 yield 語句的返回值,所以第一次使用 next 方法時,不能帶有參數(shù)。V8 引擎直接忽略第一次使用 next 方法時的參數(shù),只有從第二次使用 next 方法開始,參數(shù)才是有效的。
function* ticketGenerator() { yield 1; yield 2; yield 3; //yield,return有些像,都能返回緊跟語句后面的表達(dá)式的值, //區(qū)別是每次遇到y(tǒng)ield,函數(shù)是暫停執(zhí)行,下一次再從該位置繼續(xù)向后執(zhí)行 //而return不具備位置記憶功能,只能執(zhí)行一次,所以一個函數(shù)只能返回一個值 return 4; //yield 4; {value: 4, done: false} } const takeANumber = ticketGenerator(); var i = 0; while (i < 4) { i++; console.log(takeANumber.next()) } // { value: 1, done: false } // { value: 2, done: false } // { value: 3, done: false } // { value: 4, done: true } //for ... of依次顯示yield的值,一旦next方法返回的對象的done為 //true, 循環(huán)就會終止 for (var v of ticketGenerator()) { console.log(v); }
進(jìn)階:
function* foo(x) { var y = 2 * (yield (x + 1)); var z = yield (y / 3); return (x + y + z); } var it = foo(5); it.next() // { value:6, done:false } it.next(12) // { value:8, done:false } it.next(13) // { value:42, done:true }
如果 yield 命令后面跟的是一個遍歷器,需要在 yield 命令后面加上星號,表明它返回的是一個遍歷器。這被稱為 yield語句。*
Promise(解決異步操作的對象)pending - The initial state of a promise.
fulfilled - The state of a promise representing a successful operation.
rejected - The state of a promise representing a failed operation.
bluebird
Q
then.js
es6-promise
ypromise
async
native-promise-only
API:new Promise((resolve, reject) => {})Static Methods:
Promise.resolve(value) --返回一個使用接收到的值進(jìn)行了resolve的新的promise對象 Promise.reject(value) --返回一個使用接收到的值進(jìn)行了reject的新的promise對象 Promise.all(array) 生成并返回一個新的promise對象。 當(dāng)這個數(shù)組里的所有promise對象全部變?yōu)閞esolve或reject狀態(tài)的時候,它才會去調(diào)用 .then 方法。 eg: Promise.all([Promise.resolve("a"), "b", Promise.resolve("c")]) .then(function (res) { assert(res[0] === "a") assert(res[1] === "b") assert(res[2] === "c") }) Promise.race(array) 生成并返回一個新的promise對象。 參數(shù) promise 數(shù)組中的任何一個promise對象如果變?yōu)閞esolve或者reject的話, 該函數(shù)就會返回,并使用這個promise對象的值進(jìn)行resolve或者reject。 eg: var p1 = Promise.resolve(1), p2 = Promise.resolve(2), p3 = Promise.resolve(3); Promise.race([p1, p2, p3]).then(function (value) { console.log(value); // 1 });Prototype Methods:
Promise.then(onFulfilled, onRejected) Promise.catch(onRejected)
Example:
function taskA() { console.log("Task A"); throw new Error("throw Error Task A") } function taskB() { console.log("Task B"); } function onRejected(error) { console.log("Catch Error: ", error); } function finalTask() { console.log("Final Task"); throw new Error("throw Error Final task") } var promiseB = new Promise((resolve, reject) => reject(new Error("error msg"))) promiseB .then(success => console.log("onfulfilled ", success), err => console.log("onRejected ", err)) .then(taskA) .then(taskB) .catch(onRejected) .then(finalTask); //output: //onRejected Error: error msg //Task A //Catch Error: Error: throw Error Task A ---并沒有執(zhí)行task B //Final Task
promiseB 進(jìn)入onRejected callback后,依舊會執(zhí)行Task A, 并不會被 onRejected catch住。
taskA 發(fā)生error,不會執(zhí)行taskB,會直接到 onRejected -> finalTask
promise chain中,由于在 onRejected 和 finalTask 后面沒有 catch 處理了,因此在這兩個Task中如果出現(xiàn)異常的話將不會被捕獲,只會出現(xiàn)以下warning:
(node:83039) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: throw Error Final task
(node:83039) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/89567.html
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。寫一個符合規(guī)范并可配合使用的寫一個符合規(guī)范并可配合使用的理解的工作原理采用回調(diào)函數(shù)來處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問題描述 在開發(fā)過程中,遇到一個需求:在系統(tǒng)初始化時通過http獲取一個第三方服務(wù)器端的列表,第三方服務(wù)器提供了一個接口,可通過...
摘要:的翻譯文檔由的維護(hù)很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:理解承諾有兩個部分。如果異步操作成功,則通過的創(chuàng)建者調(diào)用函數(shù)返回預(yù)期結(jié)果,同樣,如果出現(xiàn)意外錯誤,則通過調(diào)用函數(shù)傳遞錯誤具體信息。這將與理解對象密切相關(guān)。這個函數(shù)將創(chuàng)建一個,該將在到秒之間的隨機(jī)數(shù)秒后執(zhí)行或。 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! showImg(https://segmentfault.com/img/bVbkNvF?w=1280&h=...
摘要:理解承諾有兩個部分。如果異步操作成功,則通過的創(chuàng)建者調(diào)用函數(shù)返回預(yù)期結(jié)果,同樣,如果出現(xiàn)意外錯誤,則通過調(diào)用函數(shù)傳遞錯誤具體信息。這將與理解對象密切相關(guān)。這個函數(shù)將創(chuàng)建一個,該將在到秒之間的隨機(jī)數(shù)秒后執(zhí)行或。 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! showImg(https://segmentfault.com/img/bVbkNvF?w=1280&h=...
摘要:對象設(shè)置初始狀態(tài)默認(rèn)為等待狀態(tài)用數(shù)組來保存成功函數(shù)設(shè)置為成功狀態(tài)設(shè)置為失敗狀態(tài)調(diào)用回調(diào)函數(shù)增加方法根據(jù)狀態(tài)執(zhí)行成功失敗方法執(zhí)行成功方法執(zhí)行失敗方法將成功失敗方法保存在數(shù)組里 promise理解 promise的意思是承諾。承諾理解為某個時候一些條件滿足后,會兌現(xiàn)一件事情。 //為了方便理解我編一個小故事 //先假裝我有一個女朋友 //她承諾如果她爸媽不回來就給我就可以去幫她修電腦 否則...
摘要:中就是一個構(gòu)造函數(shù)函數(shù)也是對象為什么需要多個嵌套的異步操作,如果直接用方式,會導(dǎo)致的出現(xiàn)使得異步操作更加規(guī)范,更加統(tǒng)一。的方法構(gòu)造函數(shù)構(gòu)造函數(shù)用于生成對象,函數(shù)在構(gòu)造函數(shù)執(zhí)行時同步執(zhí)行。 什么是Promise? 含以上:抽象異步操作的工具。javascript中:Promise就是一個構(gòu)造函數(shù)(函數(shù)也是對象) 為什么需要Promise? 1.多個嵌套的異步操作,如果直接用callbac...
閱讀 3197·2021-11-25 09:43
閱讀 3408·2021-11-11 16:54
閱讀 823·2021-11-02 14:42
閱讀 3742·2021-09-30 09:58
閱讀 3664·2021-09-29 09:44
閱讀 1279·2019-08-30 15:56
閱讀 2097·2019-08-30 15:54
閱讀 2985·2019-08-30 15:43