【co】ES6-20/21 iterator與generator

在這里插入圖片描述

ES6-20 iterator與generator
ES6-21 async與await、ES6的模塊化

try catch不能捕獲異步異常

  • try catch是同步代碼
try {setTimeout(() => {console.log(a)})
} catch (e) {console.log(e)
}

在這里插入圖片描述

iterator

內部迭代器:系統定義好的迭代器接口(如數組Symbol.iterator)
外部迭代器:手動部署(可以給obj定義外部迭代器)

對于遍歷器對象來說,done: false和value: undefined屬性都是可以省略的

內部迭代器:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

  • 除了next之外還可以增加return(){},在for…of循環中凡是使用break或者throw new Errow()來終止循環的,會走return
let obj = {a: 1,b: 2,c: 3,[Symbol.iterator]() {let nextIndex = 0let map = new Map()for (let [key, value] of Object.entries(this)) {map.set(key, value)}let mapEntries = [...map.entries()],len = mapEntries.lengthreturn {next() {return nextIndex < len ?{ value: mapEntries[nextIndex++], done: false } :{ value: undefined, done: true }}}}
}
for (let i of obj) {console.log(i)
}
// ["a", 1]
// ["b", 2]
// ["c", 3]

默認調用iterator接口

  • ...
  • for...of
  • Array.from()
  • map\set
  • Promise.all() Promise.race()
  • yield

generator

  • 生成器
  • 用于返回迭代器對象
  • yield只能出現在生成器中
  • yield執行的返回值是undefined(并不產生值)
  • 結合yield使用,能結合next拿到
  • yield暫停代碼運行,有記憶功能
  • return代碼終止
  • 不調用next時,不會運行test內的代碼
function * test(){yield 'a'console.log('第二次調用next時才打印')yield 'b'yield 'c'return 'd'}
let iter = test()
// 不調用next時,不會運行test內的代碼
console.log(iter.next()) // 暫停
console.log(iter.next())
console.log(iter.next())
console.log(iter.next()) // 終止 done為true了

在這里插入圖片描述

  • 打印iter
    在這里插入圖片描述

return

  • 終止迭代,done為true,value取決于是否有返回值
  • 內部return
function* test() {yield 1;return;// 再次調用next,return之后value都是undefinedyield 2;
}
let it = test()
console.log(it.next())
console.log(it.next())
console.log(it.next())

在這里插入圖片描述

function* test() {yield 1;return 10;// 返回值yield 2;
}
let it = test()
console.log(it.next())
console.log(it.next())

在這里插入圖片描述

  • 外部return,實例調用
function* test() {yield 1;yield 2;
}
let it = test()
console.log(it.next())
console.log(it.return(10))
console.log(it.next())

在這里插入圖片描述

throw

  • 必須要在第一次調用next之后調用throw,才能被捕獲(捕獲區間在try里的第一個yield之后)
  • throw的表達式本身要是正確的
function* test() {try {yield 1;yield 2;} catch (e) {console.log('生成器內部異常', e)}
}
let it = test()
console.log(it.next())
console.log(it.throw(1))
console.log(it.next())

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

  • 多次拋出只會捕獲一個
function* test() {try {yield 1;yield 2;} catch (e) {console.log('生成器內部異常', e)}
}
let it = test()
console.log(it.next())
console.log(it.throw(1))
console.log(it.throw(2))

在這里插入圖片描述

  • throw的同時,也會往下走一步
function* test() {try {yield 1;yield 2;} catch (e) {console.log('生成器內部異常', e)}yield 3;
}
let it = test()
console.log(it.next())
console.log(it.throw(1)) // 產出的是3不是2

在這里插入圖片描述

  • 捕獲異步代碼
const fs = require('fs')
const util = require('util')
const co = require('co')
let readFile = util.promisify(fs.readFile)
function* read() {try {let val1 = yield readFile('firsttxt', 'utf-8')let val2 = yield readFile(val1, 'utf-8')let val3 = yield readFile(val2, 'utf-8')console.log('inner', val3)} catch (e) {console.log('異常捕獲', e)}console.log('正常執行')
}
let it = read()
let promise = co(it)
promise.then((val) => {console.log(val)
})

在這里插入圖片描述

for…of循環

  • 直接拿到值了,不是done/value了
function* foo() {yield 1;yield 2;yield 3;yield 4;yield 5;return 6;
}for (let v of foo()) {console.log(v); // 返回的是yield產出的值
}
// 1 2 3 4 5

實現斐波那契

function* fibonacci() {let [prev, curr] = [0, 1];for (;;) {yield curr;[prev, curr] = [curr, prev + curr];}
}for (let n of fibonacci()) {if (n > 1000) break;console.log(n);
}

遍歷對象

const obj = {a: 1,b: 2,c: 3
}
function* test(obj) {for (let key in obj) {yield [key, obj[key]]}
}
for (let [key, val] of test(obj)) {console.log(key + ':' + val)
}
const obj = {a: 1,b: 2,c: 3,[Symbol.iterator]: test
}
function* test() {for (let key in this) {yield [key, this[key]]}
}
for (let [key, val] of obj) {console.log(key + ':' + val)
}

yield執行返回值

  • 只能通過next的第二次調用拿到值
const fs = require('fs')function promisifyAll(obj) {for (let [key, fn] of Object.entries(obj)) {if (typeof fn === 'function') {obj[key + 'Async'] = promisify(fn)}}
}
promisifyAll(fs)
function promisify(func) {return function (...args) {return new Promise((resolve, reject) => {func(...args, (err, data) => {if (err) {reject(new Error(err))} else {resolve(data)}})})}
}
let readFile = fs.readFileAsync
function* read() {let val1 = yield readFile('first.txt', 'utf-8')let val2 = yield readFile(val1, 'utf-8')let val3 = yield readFile(val2, 'utf-8')console.log('inner', val3)}
let it = read()
let { value } = it.next()
value.then((val1) => {let { value } = it.next(val1)value.then((val2) => {let { value } = it.next(val2)value.then((val3) => {console.log('val3', val3)it.next(val3)})})
})
// val3 66
// inner 66
let it = read()
function Co(it) {return new Promise((resolve, reject) => {let next = (data) => {let { value, done } = it.next(data)if (done) {resolve(value)} else {value.then((val) => {next(val)})}}next()})
}
let promise = Co(it)
promise.then((val) => {console.log(val)
})
  • 直接使用co包
// npm i co
let co = require('co')
let promise = co(it)
promise.then((val) => {console.log(val)
})

yield*

  • ES6 提供了yield*表達式,用來在一個 Generator 函數里面執行另一個 Generator 函數。
function* bar() {yield 'x';yield* foo();yield 'y';
}// 等同于
function* bar() {yield 'x';yield 'a';yield 'b';yield 'y';
}

async await

  • async替換*
  • await替換yield
  • async函數內無論寫return什么,返回值都是promise(隱式通過Promise.resolve()包裝了返回值)
const fs = require('fs')
const util = require('util')
const co = require('co')
let readFile = util.promisify(fs.readFile)
async function read() {try {let val1 = await readFile('first.txt', 'utf-8')let val2 = await readFile(val1, 'utf-8')let val3 = await readFile(val2, 'utf-8')console.log('inner', val3)} catch (e) {console.log('異常捕獲', e)}console.log('正常執行')}
// let it = read()
// let promise = co(it)
// async await內置執行器 co
let promise = read()
promise.then((val) => {console.log(val)
})
// 也可以在返回的promise.catch里捕獲異常

在這里插入圖片描述

  • promise內部異常
const fs = require('fs')
const util = require('util')
const co = require('co')
let readFile = util.promisify(fs.readFile)
async function read() {let val1 = await readFile('first.txt', 'utf-8')console.log(a)let val2 = await readFile(val1, 'utf-8')let val3 = await readFile(val2, 'utf-8')console.log('inner', val3)console.log('正常執行')
}
let promise = read()
promise.then((val) => {console.log(val)
}).catch((e) => {console.log('catch到異常', e)
})

在這里插入圖片描述

Promise.all

  • 一個出錯,在then里都拿不到,會在catch里捕獲到第一個錯誤
const fs = require('fs')
const util = require('util')
let readFile = util.promisify(fs.readFile)
let f = Promise.all([readFile('first.txt', 'utf-8'),readFile('secondtxt', 'utf-8'),readFile('thirdtxt', 'utf-8'),
])
f.then((val) => {console.log('then', val)
}).catch((err) => {console.log('err', err)
})

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250973.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250973.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250973.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嵌入式系統UBOOT

一個完整的嵌入式linux系統包含4部分內容&#xff1a;Bootloader、Parameters、Kernel、Root File System。3、4、5、6部分詳細介紹了這4部分的內容&#xff0c;這是Linux底層軟件開發人員應該掌握的。通過學習這些章節&#xff0c;您可以詳細了解到如何在一個裸板上裁減、移植…

驅動芯片

一 LED驅動芯片&#xff1a; 1.1 TM1640:16位數碼管驅動芯片&#xff0c;2線制控制&#xff08;CLK/DIN&#xff09;,SCLK低電平時DIN輸入&#xff0c;而SCLK高電平時保持DIN保持不變&#xff1b;開始傳輸&#xff1a;SCLKH時DIN由高變低&#xff0c;停止傳輸SCLKH時DIN由由低變…

jquery --- 控制元素的隱藏/顯示

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> </head> <body> <div id"panel"><h5 class"head">什么是jquery?</h5><div class"content" style"display:non…

confusion_matrix(混淆矩陣)

作者&#xff1a;十歲的小男孩 凡心所向&#xff0c;素履可往 目錄 監督學習—混淆矩陣 是什么&#xff1f;有什么用&#xff1f;怎么用&#xff1f; 非監督學習—匹配矩陣 混淆矩陣 矩陣每一列代表預測值&#xff0c;每一行代表的是實際的類別。這個名字來源于它可以非常容…

Python 21 Django 實用小案例1

實用案例 驗證碼與驗證 KindEditor 組合搜索的實現 單例模式 beautifulsoup4 驗證碼與驗證 需要安裝Pillow模塊 pip stall pillow1、首先需要借助pillow模塊用來畫一個驗證碼圖形&#xff0c;這里單獨封裝了一個py文件&#xff0c;調用一個方法就好了 1 #!/user/bin/env python…

jquery --- 事件處理函數的event對象的幾個屬性(方法)說明

1.event.type: 事件的類型 $(a).click(function(event) {alert(event.type);return false; // 阻止鏈接跳轉 }); // click2.event.preventDefault(): 阻止默認事件 $("#sub").bind("click", function(event) {var username $("#username").va…

數據恢復軟件

鏈接&#xff1a;https://pan.baidu.com/s/1n6x5vhW-3SY8MAvvnqVtog 密碼&#xff1a;thh0轉載于:https://www.cnblogs.com/huanu/p/9452039.html

VMware

1.VMware軟件安裝&#xff1a; https://jingyan.baidu.com/article/9f7e7ec09da5906f281554d6.html 2&#xff0c;鏡像文件下載地址&#xff1a;http://www.cnbeta.com/articles/tech/566773.htm 有圖形界面。 或是在官網&#xff1a;https://wiki.centos.org/Download 2.cento…

jquery --- 全選、全不選、反選、提交

注意:jquery 提供的$(’#id’).attr(‘checked’,true)方法,在某些情況下會失效… 因此,使用js原生的 .checked true方法 控制 // html <form>你愛好的運動是? <br/><input type"checkbox" name"items" value"足球" /> 足球…

【重要】ES6-23 JavaScript模塊化

前端js模塊化的演變發展 模塊化解決的問題 傳統模塊化、插件化 CommonJS AMD/CMD ES6模塊化 ES6以前 沒有js引擎 一開始js寫在html的script標簽里js內容增多&#xff0c;抽取出index.js文件&#xff0c;外部引入js再增加&#xff0c;index.html對應index.js index2.html對應ind…

Quartz.Net定時任務EF+MVC版的web服務

之前項目采用JAVA 的 Quartz 進行定時服調度務處理程序&#xff0c;目前在.NET下面使用依然可以完成相同的工作任務&#xff0c;其實什么語言不重要&#xff0c;關鍵是我們要學會利用語言實現價值。它是一個簡單的執行任務計劃的組件&#xff0c;基本包括這三部分&#xff1a;J…

jquery --- 多選下拉框的移動(穿梭框)

效果如下: 幾個注意地方: 1.多選下拉框需要添加 multiple 2.獲取選中的元素KaTeX parse error: Expected EOF, got # at position 3: (#?id option:selec…(#id option:not(:selected)) 下面是代碼的各個部分實現, 方便引用,最后是總體代碼,方便理解 添加選中到右邊: // …

ES6-24 生成器與迭代器的應用

手寫生成器 先done再false&#xff0c;不然index就提前了一步1 var arr [1,2] function generator(arr){var i 0;return{next(){var done i > arr.length ? true : false,value done ? undefined : arr[i];return {value : value,done : done} }} } var gen gener…

1013 B. And

鏈接 [http://codeforces.com/contest/1013/problem/B] 題意 給你一個n和x,再給n個數&#xff0c;有一種操作用x&a[i]取代&#xff0c;a[i],問使其中至少兩個數相同&#xff0c;要多少次操作&#xff0c;如果不能輸出-1. 思路 x&a[i],無論&多少次&#xff0c;a[i]都…

jquery --- 收縮兄弟元素

點擊高亮的收縮兄弟元素. 思路: 1.點擊的其實是tr.(類為parent) 2.toggleClass可以切換樣式 3.slblings(’.class’).toggle 可以根據其類來進行隱藏顯示 代碼如下: <!DOCTYPE html> <html> <head> <meta charset"utf-8"><style>.pa…

Webpack基礎

path.resolve // 只要以/開頭&#xff0c;就變為絕對路徑 // ./和直接寫效果相同 var path require("path") //引入node的path模塊path.resolve(/foo/bar, ./baz) // returns /foo/bar/baz path.resolve(/foo/bar, baz) // returns /foo/bar/baz path.res…

(php)實現萬年歷

1 <?php2 //修改頁面編碼3 header("content-type:text/html;charsetutf-8");4 5 //獲取當前年6 $year$_GET[y]?$_GET[y]:date(Y);7 8 //獲取當年月9 $month$_GET[m]?$_GET[m]:date(m); 10 11 //獲取當前月多少天 12 $daysdate(t,strtotime("{$year}-{$m…

LeetCode:二叉樹相關應用

LeetCode&#xff1a;二叉樹相關應用 基礎知識 617.歸并兩個二叉樹 題目 Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not. You need to merge them into a new …

ubuntu16.04 python3.5 opencv的安裝與卸載(轉載)

轉載https://blog.csdn.net/qq_37541097/article/details/79045595 Ubuntu16.04 自帶python2.7和python3.5兩個版本&#xff0c;默認為python2.7&#xff0c;我使用的是3.5&#xff0c;所以首先將默認的python版本改為3.5. 在終端輸入下列指令&#xff1a; sudo update-alterna…

Webpack進階(一) tree shaking與不同mode

Tree Shaking 生產環境去除沒有使用到的內容&#xff08;開發環境沒有刪除&#xff0c;會影響調試&#xff09;只支持ESM規范&#xff08;靜態引入&#xff0c;編譯時引入&#xff09;&#xff0c;不支持CJS&#xff08;動態引入&#xff0c;執行時引入&#xff09; // webpa…