摘要:參數(shù)數(shù)組中的任何一個(gè)對(duì)象如果變?yōu)榛蛘叩脑?,該函?shù)就會(huì)返回,并使用這個(gè)對(duì)象的值進(jìn)行或者。并沒有執(zhí)行進(jìn)入后,依舊會(huì)執(zhí)行并不會(huì)被住。發(fā)生,不會(huì)執(zhí)行,會(huì)直接到中,由于在和后面沒有處理了,因此在這兩個(gè)中如果出現(xiàn)異常的話將不會(huì)被捕獲只會(huì)出現(xiàn)以下
ES6 Generator/Promise Generator
node -harmony app.js (harmony 告訴Node使用ES6來運(yùn)行)
next 方法的參數(shù)表示上一個(gè) yield 語(yǔ)句的返回值,所以第一次使用 next 方法時(shí),不能帶有參數(shù)。V8 引擎直接忽略第一次使用 next 方法時(shí)的參數(shù),只有從第二次使用 next 方法開始,參數(shù)才是有效的。
function* ticketGenerator() { yield 1; yield 2; yield 3; //yield,return有些像,都能返回緊跟語(yǔ)句后面的表達(dá)式的值, //區(qū)別是每次遇到y(tǒng)ield,函數(shù)是暫停執(zhí)行,下一次再?gòu)脑撐恢美^續(xù)向后執(zhí)行 //而return不具備位置記憶功能,只能執(zhí)行一次,所以一個(gè)函數(shù)只能返回一個(gè)值 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方法返回的對(duì)象的done為 //true, 循環(huán)就會(huì)終止 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 命令后面跟的是一個(gè)遍歷器,需要在 yield 命令后面加上星號(hào),表明它返回的是一個(gè)遍歷器。這被稱為 yield語(yǔ)句。*
Promise(解決異步操作的對(duì)象)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) --返回一個(gè)使用接收到的值進(jìn)行了resolve的新的promise對(duì)象 Promise.reject(value) --返回一個(gè)使用接收到的值進(jìn)行了reject的新的promise對(duì)象 Promise.all(array) 生成并返回一個(gè)新的promise對(duì)象。 當(dāng)這個(gè)數(shù)組里的所有promise對(duì)象全部變?yōu)閞esolve或reject狀態(tài)的時(shí)候,它才會(huì)去調(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) 生成并返回一個(gè)新的promise對(duì)象。 參數(shù) promise 數(shù)組中的任何一個(gè)promise對(duì)象如果變?yōu)閞esolve或者reject的話, 該函數(shù)就會(huì)返回,并使用這個(gè)promise對(duì)象的值進(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后,依舊會(huì)執(zhí)行Task A, 并不會(huì)被 onRejected catch住。
taskA 發(fā)生error,不會(huì)執(zhí)行taskB,會(huì)直接到 onRejected -> finalTask
promise chain中,由于在 onRejected 和 finalTask 后面沒有 catch 處理了,因此在這兩個(gè)Task中如果出現(xiàn)異常的話將不會(huì)被捕獲,只會(huì)出現(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89567.html
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。寫一個(gè)符合規(guī)范并可配合使用的寫一個(gè)符合規(guī)范并可配合使用的理解的工作原理采用回調(diào)函數(shù)來處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問題描述 在開發(fā)過程中,遇到一個(gè)需求:在系統(tǒng)初始化時(shí)通過http獲取一個(gè)第三方服務(wù)器端的列表,第三方服務(wù)器提供了一個(gè)接口,可通過...
摘要:的翻譯文檔由的維護(hù)很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:理解承諾有兩個(gè)部分。如果異步操作成功,則通過的創(chuàng)建者調(diào)用函數(shù)返回預(yù)期結(jié)果,同樣,如果出現(xiàn)意外錯(cuò)誤,則通過調(diào)用函數(shù)傳遞錯(cuò)誤具體信息。這將與理解對(duì)象密切相關(guān)。這個(gè)函數(shù)將創(chuàng)建一個(gè),該將在到秒之間的隨機(jī)數(shù)秒后執(zhí)行或。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! showImg(https://segmentfault.com/img/bVbkNvF?w=1280&h=...
摘要:理解承諾有兩個(gè)部分。如果異步操作成功,則通過的創(chuàng)建者調(diào)用函數(shù)返回預(yù)期結(jié)果,同樣,如果出現(xiàn)意外錯(cuò)誤,則通過調(diào)用函數(shù)傳遞錯(cuò)誤具體信息。這將與理解對(duì)象密切相關(guān)。這個(gè)函數(shù)將創(chuàng)建一個(gè),該將在到秒之間的隨機(jī)數(shù)秒后執(zhí)行或。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! showImg(https://segmentfault.com/img/bVbkNvF?w=1280&h=...
摘要:對(duì)象設(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的意思是承諾。承諾理解為某個(gè)時(shí)候一些條件滿足后,會(huì)兌現(xiàn)一件事情。 //為了方便理解我編一個(gè)小故事 //先假裝我有一個(gè)女朋友 //她承諾如果她爸媽不回來就給我就可以去幫她修電腦 否則...
摘要:中就是一個(gè)構(gòu)造函數(shù)函數(shù)也是對(duì)象為什么需要多個(gè)嵌套的異步操作,如果直接用方式,會(huì)導(dǎo)致的出現(xiàn)使得異步操作更加規(guī)范,更加統(tǒng)一。的方法構(gòu)造函數(shù)構(gòu)造函數(shù)用于生成對(duì)象,函數(shù)在構(gòu)造函數(shù)執(zhí)行時(shí)同步執(zhí)行。 什么是Promise? 含以上:抽象異步操作的工具。javascript中:Promise就是一個(gè)構(gòu)造函數(shù)(函數(shù)也是對(duì)象) 為什么需要Promise? 1.多個(gè)嵌套的異步操作,如果直接用callbac...
閱讀 3207·2021-11-25 09:43
閱讀 3417·2021-11-11 16:54
閱讀 843·2021-11-02 14:42
閱讀 3769·2021-09-30 09:58
閱讀 3675·2021-09-29 09:44
閱讀 1287·2019-08-30 15:56
閱讀 2109·2019-08-30 15:54
閱讀 2995·2019-08-30 15:43