【js-非同步編程】 孤獨的人,不要寫非同步

【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真的是好用到想哭。


這一年,經歷很多亂七八糟的事,整個人變得很喪,很抑鬱。 太煩躁的時候,逼著自己去看看其他各類文檔,然後思考,嘗試寫點代碼。能夠讓自己安靜一點。 人生真的很煎熬。但又沒有結束的勇氣。

我主要在雲南的昆明和曲靖兩個城市流浪,如果有同城的程序員看到,加個好友。

我們可以聊聊,或者組織聚會。 下面是我的微信:

下一篇文章,各類設計模式。

推薦閱讀:

常規操作之非同步
Node.js 非同步異聞錄

TAG:Nodejs | 非同步 | Promise |