Promise
一個基礎的 Promise 宣告:let status = false; let p = new Promise(function(resolve,reject){ //do something if(status){ resolve("OK"); //丟出正確 }else{ reject("Dead"); //丟出回絕 } }); //實作 p.then(function(resolve){ //正確的話會進入 console.log(resolve); // "OK" }).catch(function(reject){ //選擇性再加一個 .catch 選擇是否要接收 reject (回絕參數) 值 //如果被回絕才會進入 console.log(reject); //"Dead" });
Promise.resolve
Promise.resolve 和 Promise.reject 都可以直接把現有物件轉換成 Promise, 一般來說, resolve 會直接接收成接受的 Promise:Promise.resolve('Hello').then(function (resolve){ console.log(resolve) });
Promise.reject
Promise.reject 會直接轉換物件為 reject:var p = Promise.reject('Dead'); p.then(new Error('fail'), function (reason){ console.log(reason) });
Promise.all
Promise.all 會把所有 Promise 執行後,分別會丟出正確和失敗的值。只寫一個 function 當接收 callback 的情況下,會接收所有 resolve 的值,但 reject 會出錯,所以要自行在 .then 結束後加上 .catch(function(e){}) 來接收錯誤。
有兩個 function 當作 callback 的情況下,只有全部成功才會進入第一個 callback function,如果有一個出錯,會在第二個 callback function 顯示錯誤的那個 reject 參數。
var a = Promise.resolve(10); var b = Promise.resolve(20); var c = Promise.resolve(30); var d = Promise.resolve(40); var e = Promise.reject(50); //出錯 Promise.all([a,b,c,d,e]).then(function(resolve){ //接收 resolve 的值 console.log(resolve); //10 20 30 40, 但是 e 出錯,這裡就不會顯示任何東西 },function(reject){ //接收 reject 的值 console.log(reject); //50 e 出錯 });
Promise.race (競賽模式)
Promise.race 一樣會執行所有 Promise, 只要碰到一個正確或失敗,就會跳出 callback。(有時間影響的話,也會從最先回傳的那個人回傳)這裡分別用 3 種方式進行測試, a 會馬上回傳 resolve, b 等待 10 毫秒才會回傳 resolve, c 馬上跳錯。
以下 race 只有一個 function 的參數下,只接收 resolve 的值,要自行加上 .catch 在 then 後面,如果有兩個 function 當作 callback 的參數下,會判斷第一個接收者是 resolve (丟到第一個 function 參數),如果是 reject,就會丟到第二個 function 參數。
var a = Promise.resolve(10); var b = new Promise(function(resolve){ setTimeout(function(){ resolve(20); },10); }); var c = Promise.reject("Dead"); //注意 [] 中的順序, b 雖然第一個開始跑,但是要延遲,所以 a 因為馬上就執行,就先回傳。 Promise.race([b,a,c]).then(function(resolve){ //接收 resolve 的值 console.log(resolve); //10 20 30 40 },function(e){ console.log(e); });---
Collections
Collections 集合模式的幾種重要類別如下:Map
Map 和一般 Array/Object 比較,最大的差距就是 key 鍵值,Map 鍵值可以丟入 object ,但是 Object 鍵值只能丟 String。let a = {} //a[{id:1}] //error //Map: a = new Map(); //a["X"] //error 不能當作 object 使用。 let key = {id:1}; //注意, 一定要丟這個 key, 如果產生一個 object, map 會偵測 object id ,所以新建立的 object 會讀不到 map 的值 // a.set({id:1}, "Me"); //這樣 get 絕對得不到東西。 a.set(key, "Me"); a.get(key); // Me //迭代方式: for(let i of a){ console.log(i); }
Set
Set 特性是沒有 key/value 樣式,且不允許重複的值,重複設定的值會被忽略。var set = new Set(); set.add(1); set.add(1); //忽略 set.add(2); set.add("Hello world"); for(let i of set){ console.log(i); }
WeakMap
WeakMap 和 Map 用法一樣,只是 Map 中的 key 只要任一個被指定 null, 而且沒有指向任何參考,就會自動被回收 (消失)。WeakSet
WeakSet 是只要任一值被指定 null, 就會自動被回收 (消失)。Reference;
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/reject
https://wohugb.gitbooks.io/ecmascript-6/content/docs/promise.html
https://medium.com/@WendellLiu/%E5%88%A5%E9%80%99%E6%A8%A3%E4%BD%BF%E7%94%A8promise-d4f5a731adb4
https://juejin.im/entry/5844c8e2128fe100577d15e4
沒有留言:
張貼留言