1. 程式人生 > >理解promise及適用場景

理解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

實現非同步的方法

實現非同步的方法目前有,自定義巢狀,PromisegeneratorDefferd,還有ES7async(其實是generator的封裝),不同場景可以選擇不同的方式去實現

promise的定義

先給下Promise學術點的描述:
promise代表一個非同步操作的執行返回狀態,這個執行返回狀態在promise物件建立時未必已知。它允許你為非同步操作的成功或失敗指定處理方法

promise的用途

Promise

可以用來避免非同步操作函式裡的巢狀回撥callback hell)問題,因為解決非同步最直接的方法是回撥巢狀,將後一個的操作放在前一個操作的非同步回撥裡,但如果操作多了,就會有很多層的巢狀。

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雖好,可不要亂用哦,實時牢記它會吞沒錯誤的風險。