老生常談promise 對於promise大部分人應該不陌生了,他是ES6的新特性之一,若是你是一個追求潮流的coder那麼你應該用過axios請求方式,這個向後臺發送請求的方式就用到了promise 我接觸promise是一年前,部門的程序員會輪流培訓,恰好當時我在看一些關於axios的東西,就準備培訓一些關於promise的知識,因此我就找了不少關於promise的博客,看的也是雲裏霧裏,可想而知培訓的效果也不是很好ios
promise很火,能夠說是程序員居家旅行必備的技能之一了,因此說對於這樣的東西,咱們最好仍是吃透它,這樣纔不會在代碼當中迷失。程序員
大多數人開發的過程當中應該都會遇到一些異步的問題,好比咱們必須等請求接口返回數據後纔去作另一些事情,咱們都是經過回調函數來作 大部分好的狀況是隻須要等待一個異步的結果就能夠去作一些事情,那麼極端的狀況是不一樣的異步嵌套,讓咱們的代碼看上去就像一個金字塔,一層層的異步嵌套讓咱們頭皮發麻,這種狀況被咱們稱爲回調地獄編程
fs.readFile('./sample.txt', 'utf-8', (err, content) => {
let keyword = content.substring(0, 5);
db.find(`select * from sample where kw = ${keyword}`, (err, res) => {
get(`/sampleget?count=${res.length}`, data => {
console.log(data);
});
});
});
複製代碼
promise就能夠解決這些問題,可讓咱們的代碼跟優雅更具備可讀性,給promise下個定義axios
promise是異步編程的一種解決方案,比回調函數更何理更強大promise
咱們從使用層面上再來定義如下promise瀏覽器
#####同步和異步 你們都知道同步和異步,可是讓你給他下個定義你知道嗎?bash
通常而言,操做分爲兩種發出調用和獲得結果,發出調用當即獲得結果爲同步,發出調用,沒法當即獲得結果,須要一些額外的操做才能獲得預期的結果爲異步。同步是在發出調用後一直等待程序是阻塞狀態,異步發出調用後程序能夠繼續執行dom
dom.addEventListener(type,callback)
$(dom).on(type,callback)
複製代碼
new Promise((resolve,reject)=>{
//此處執行一段異步代碼 (這個部分被稱爲執行器)
//異步處理有結果以後執行對應的
resolve() //操做成功調用此回調,把promise的實例狀態改爲fullfilled
reject() //操做失敗調用此回調,把promise的實例狀態改爲rejected
}).then((res,rej) => {
})
複製代碼
在then函數裏返回一個新的promise,then支持兩個參數,分別對應上一個promise實例的兩個回調 then能夠鏈式的調用,當前面一個promise的狀態改變時,後面的then會根據前面一個promise的狀態執行對應狀態的回調 (這個地方有一個坑 由於須要手動return) 異步
promise是一個代理對象,它和原先的操做並未關係,咱們只須要把原先的操做放入執行器裏 它經過一個回調函數,而後把其它的回調所有基於此回調函數異步編程