介紹ES7出現的 Async、Await。包含 Promise 概念及新的 fetch 語法糖。
不嗦囉,直接看 code
// 宣告 XHR 的物件 var Req = new XMLHttpRequest(); Req.open('post', '/blog/GetLearnIndex', true); Req.send(); Req.onload = xmlHttpReqOnload; Req.onerror = xmlHttpReqOnError; function xmlHttpReqOnload() { const data = JSON.parse(this.responseText); console.log('XMLHttpRequset result : ', data); } function xmlHttpReqOnError(err) { console.log('錯誤', err) }
Promise 物件代表一個非同步操作,它有完成、失敗的兩個事件,這兩事件都可以回傳一個值 (物件) 。 回傳的 Promise 必須接 .then(func(){ }); 來 (或是用 await) 處理事情 。
let runPromise = (someone, timer, success = true) => { console.log('01.', `${someone} 開始跑開始`); //resolve , reject 是固定要的兩個事件 , 可以使用別的名稱 return new Promise((resolve, reject) => { if (success) { setTimeout(function () { // 3 秒時間後,透過 resolve 來表示完成 let str = `${someone} 跑 ${timer / 1000} 秒時間(fulfilled)`; console.log('03. ', str) resolve(str); //成功回傳訊息 }, timer); } else { let str = `${someone} 跌倒失敗(rejected)`; console.log('02. ', str); // reject 訊息 reject(str) } }); } // 此段函式並不會影響其它函示的執行 runPromise('小明', 1000, false).then((someone) => { console.log('04. then:', someone) }).catch((err) => { console.log('04. error:', err); }); // 以下這段 console 會在 promise 結束前就執行 console.log('02. | 03. ', '這裡執行了一段 console , 但可能因為 Promise 的速度很快, 所以排在 03');
// Fetch 的基本範例及概念 fetch(api_url, {}) .then((response) => { // 第一個 then 處理 response 資料內容 // response.body 是一個 ReadableStream 的物件 // response.ok true|false // response.status 200 (如果ok的話) console.log('Fetch response : ', response); //處理成自己要用的 資料型態 return response.json(); //還有下列的方法可將 ReadableString 物件轉換成自己想要處理的物件 , 一般都是 josn // .arrayBuffer() // .blob() //圖片之類的 // .formData() // .json() // .text() }).then((data) => { // 第二個 then 處理資料 console.log(data); }).catch((err) => { console.log('錯誤:', err); }); // fetch post 的指定資料 fetch(api_url, { method: 'POST', headers: { 'Content-Type': 'application/json' // headers 加入 json 格式 }, body: JSON.stringify({ // body 將 json 轉字串送出 email: 'lovef1232e@hexschool.com', password: '12345678' }) }).then((response) => { // }).then((jsonData) => { // }).catch((err) => { // })
只要有 await 的 function 就一定是 async function..
let myexe = async function () { const readyData = await LoadData(); return readyData; // 這邊會等 LoadData 完成後回傳 }; let LoadData = async () => { let res = await fetch(api_url); let data = await res.json(); return data; }; let promise = myexe(); //promise 是一個 Promise 非同步物件 var res = promise.then((res) => { // return res; }).catch((err) => { console.log('catch exception:', err); }); console.log('finall:', res);