理解promise及適用場景
非同步的概念:
參考:http://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&mid=2651222422&idx=1&sn=8c059af21a4cd7c9041ab719459451d5&
mpshare=1&scene=23&srcid=0511fvGzKWdEjPUi9hxyAHIn#rd
http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html
promise陷阱:http://www.jianshu.com/p/9e4026614fbe
promise與非同步:http://ouvens.github.io/frontend-javascript/2016/03/04/promise-and-asyncjs.html
實現非同步的方法
實現非同步的方法目前有,自定義巢狀,Promise、generator、Defferd,還有ES7的async(其實是generator的封裝),不同場景可以選擇不同的方式去實現
promise的定義
先給下Promise學術點的描述:
promise代表一個非同步操作的執行返回狀態,這個執行返回狀態在promise物件建立時未必已知。它允許你為非同步操作的成功或失敗指定處理方法。
promise的用途
Promise
promise的知識點
1.Promise例項的then方法作用是為Promise例項新增狀態改變時的回撥函式。then方法的第一個引數是resolved狀態的回撥函式,第二個引數是rejected狀態的回撥函式。
2.then方法返回的是一個新的Promise例項,(注意:不是原來那個Promise例項)。因此可以採用鏈式寫法。
3.Promise物件的錯誤具有“冒泡”性質,會一直向後傳遞,直到被捕獲為止。即錯誤總會被下一個catch語句捕獲。
4.一般,不要在then 方法中定義rejected狀態的回撥函式(即then的第二個引數),而應總是使用catch方法。因為catch更接近同步寫法。
5.catch方法返回的還是一個Promise物件,可接著呼叫then方法。
6.在 JavaScript 函式中,只有 return / yield / throw 會中斷函式的執行,其他的都無法阻止其執行到結束的,這也是所謂的Run-to-completion 特性。
promise的優點
1. Promise 的一大優點,就是結果不變性,一旦 Promise 的值確定為fulfilled 或者 rejected 後,無論過多久,獲取到的 Promise 物件的值都是一樣的。
對不變性的理解:
像 resolve/reject 不過只是一個回撥而已,而所謂的不變性只是說,當遇到第一個 resolve/reject 後,便根據其結果給此 Promise 打上了一個 tag,並且不能更改,而後面的該幹啥繼續幹,不幹本 Promise 的事兒了。
使用promise注意事項
1.始終在Promise 構造器中書寫邏輯的話,即使出現了意外的輸入,也能絕大部分情況下返回一個Rejected 的 Promise
2.在 Promise 構造器中,除非你明確知道使用 throw 的正確姿勢,否則都請使用 reject。
3。能夠相容 Promise 和 Callback 確實是件很棒的事情,用第三方程式碼前請儘量理解其原理,短小的話完全可以自己寫一個。Promise雖好,可不要亂用哦,實時牢記它會吞沒錯誤的風險。