【js-非同步編程】 孤獨的人,不要寫非同步
來自專欄 js全棧工程師
前言:今天很喪,不想說,也不寫。 其實我一直都喪。
非同步編程三大件: 回調,Promise, async。 每種技巧都很多文檔可以學習,但是組合使用的就很少了。所以,獻醜了
代碼運行環node,框架koa
- 回調函數
- 閉包回調函數
- Promise
- Promise回調
- async
回調函數
大神們的回掉函數都是callback這樣聲明的,但是我懶。所以用cd來表示。這裡用es6的語法,原諒我還是懶,function沒箭頭好用
回調函數有兩步?第一步,產生需要返回值的函數,第二部,獲取返回值的函數。
// 回調函數第一步const collic = (cd) => { let obj = { name:hez, "age":24 } cd(obj) //重點, 調用函數參數,給參數添加參數。}//獲取回調函數collic((e)=>{ console.log(e) //這裡,調用回調函數,參數也是一個函數。}) // 函數,參數的函數里有要的回調質。惡性吧? 關鍵還不好用
感謝閉包的存在,讓地獄回調得意改善。
創建回調函數,目的不是為了回調,而是我獲取同步代碼拿不到值。看仔細,我出招了。
const collic = (cd) =>{ let obj = { name:hez, "age":24 } return cd(obj) //回調函數里的閉包,返回值。}
閉包回調
為什麼這裡寫,因為我在回調函數里,獲取到值,就去用,回調函數就會邊那個這個樣子。所以,優雅點。
let add = collic((e)=>{ console.log(e) return e //回調函數,參數,函數里返回值 }) // 這樣,add就能是我一個非同步函數里要的值,理論上來說,這很優雅console.log(回掉, add)
Promise
還有一種場景,回調里的非同步。怎麼破,心裡默念mmp就好了。但代碼還是要寫了。那就Promise試試
// Promise 函數let Pro = (url) => new Promise((r,e) => { request(https://api.imjad.cn/cloudmusic/?type=comments&id=28012031&offset=1, function (error, response, body) { try { r(2222) } catch (error) { e(error) } })})// node中的使用的場景router.get(/, async (ctx,nex)=>{ ctx.body = await Pro() })
Promise回調
暈了沒有?先別,再看看這個函數。 老實說,這種寫法有點脫褲子放p的感覺。但是之後你會發現,使用設計模式的時候,這種還是還不錯。
// 回調函數const collic = (cd) =>{ request(https://api.imjad.cn/cloudmusic/?type=comments&id=28012031&offset=1, function (error, response, body) { if (!error && response.statusCode == 200) { cd(body) } })}// Promise回調 ds函數,就是屌絲的意思router.get(/, async (ctx,nex)=>{ let ds = (res) => new Promise((r,j) => { try { collic((res) => { r(res) }) } catch (error) { j(error) } }) ctx.body = await ds()})
async
諸君,拔刀吧!!! 管理多個非同步的時候,就將用到async。其實很多地方在業務考慮之初考慮到。設計資料庫的時候,能避免開的。但這是架構端的事了。這個小弟就說不清了。
// Promise 函數let Pro = (url) => new Promise((r,e) => { request(https://api.imjad.cn/cloudmusic/?type=comments&id=28012031&offset=1, function (error, response, body) { try { r(body) } catch (error) { e(error) } })})//下面的寫法不嚴謹。一個完整的返回體,有判斷狀態,鑒權等操作。這裡只為了直白。router.get(/, async (ctx,nex)=>{ let titles = { code: 404, userId:hez } let add = await Pro() ctx.body = await [titles, add]})
心累,等你需要返回很多埠的數據時候。就明白這裡這麼做的意義。還有一種場景,各種設計模式,甚至是演算法運用的時候。async真的是好用到想哭。
猝
這一年,經歷很多亂七八糟的事,整個人變得很喪,很抑鬱。 太煩躁的時候,逼著自己去看看其他各類文檔,然後思考,嘗試寫點代碼。能夠讓自己安靜一點。 人生真的很煎熬。但又沒有結束的勇氣。
我主要在雲南的昆明和曲靖兩個城市流浪,如果有同城的程序員看到,加個好友。
我們可以聊聊,或者組織聚會。 下面是我的微信:
下一篇文章,各類設計模式。
推薦閱讀: