標籤:錯誤 非同步 編程 response amazon es6 ret 未來 另一個
非同步載入一直是我很頭痛的問題,本科階段學過非同步同步通訊就把我繞的很糊塗。但是接觸到JS中的非同步載入後我才真正認識到,所謂的非同步載入就像一個客服中心,每一個工作人員就對應一條工作流程線。下面我會詳細介紹pronise的實現方法。
promise,就是一個對象,用來傳遞非同步作業訊息。它代表某個未來才會知道結果(成功或失敗)的事件。
pomise對象的特點包括:
(1) 對象的狀態不受外界的影響。
有3個狀態,Pendind、Resolved和Rejected。只有非同步作業的結果可以決定當前哪一種狀態,任何其他動作都無法改變這個狀態。
(2) 一旦狀態改變就不會再變,任何時候都可以得到這個結果。
promise的狀態改變只有兩種,一個是從Pending到Resolved,另一個是從Pending到Rejected。只要其中一個發生,狀態就凝固了,任何其他動作都無法改變這個狀態。
pomise對象的缺點包括:
(1) 一旦建立就會立即執行,無法取消
(2) 如果不設定回呼函數,內部錯誤無法拋出
(3) 當處於pending狀態時,無法得知目前進展到哪一階段。
相容性:
Promise只是讓我們當下的JS換了一種形式實現,更符合編程時候的思考角度與方式。因此,通過特定的轉換,我們也可以讓不支援Promise的低版本瀏覽器支援之。您可以試試在頁面引入如下JS:
<script src="http://s3.amazonaws.com/es6-promises/promise-0.1.1.min.js"></script>
基本用法
promise對象的AJAX實現
var getJSON = function(url){ var promise = new Promise(function(resolve, reject){ var xhr = new XMLHttpRequest(); xhr.open("GET",url); xhr.onreadystatechange = handler; xhr.responseType = "json"; xhr.setRequestHeader("Accept", "application/json"); xhr.send(); function handler() { if( this.readyState != 4){ return; } if( this.status == 200){ resolve( this.response); }else{ reject( new Error( this.statusText)); } } }); return promise;}getJSON(‘./post.json‘).then(function(json){ console.log("content" + json);}).catch{ console.log("出錯了")}
....未更新完
javaScript之promise