異步編程是Javascript
的特性之一,正是由於這種特性,才使得咱們在瀏覽網頁的時候,即便同時加載很是多的文件圖片,也能保證速度的流暢。異步編程算是彌補了JS做爲單線程語言的不足。前端
傳統的異步編程主要是經過回調函數和事件來實現的,一般咱們見到的回調陷阱就是經過這種方式實現的;而ES6提出的Promise
是 異步編程的另外一種解決方案,給咱們提供了以同步的方式解決異步需求的選擇。es6
所謂Promise
,簡單說就是一個容器,裏面保存着某個將來纔會結束的事件(一般是一個異步操做)的結果。編程
一個Promise對象表明一個異步操做,Promise
有三種狀態:Pending(進行中)
、Resolved(完成)
、Rejected(失敗)
。json
Promise只有兩種狀態的轉變方式,從Pending
變爲Resolved
和從Pending
變爲Rejected
,狀態一旦轉變,將會被固定,再也不變化。promise
Promise
一旦被初始化就不能被中途取消了,另外當處於Pending
狀態時,不能更具體的區分狀態。app
咱們先來看一個標準的Promise
實例異步
var promise = new Promise(function(resolve, reject){ //do something if(/*操做成功*/){ resolve(value); }else{ reject(error); } });
Promise
實例化以後,能夠用then方法指定Resolved
狀態和Reject
狀態的回調函數。async
promise.then(function(value) { //成功 }, function(error) { //失敗 }
咱們用Promise
實現一個異步加載圖片的例子。異步編程
function asyncLoadImage(url) { return new Promise(function(resolve, reject){ //初始化圖片對象 var image = new Image(); //加載成功 image.onload = function(){ resolve(image); }; //加載失敗 image.onerror = function(){ reject("圖片加載失敗!"); }; image.src = url; }); } //實際應用 asyncLoadImage("index.jpg").then(function(value){ console.log(value.src); }, function(error){ console.log(error); }
咱們使用then()
給Promise
對象添加成功和失敗的操做。函數
注意若是採用如下寫法是不可行的。
function asyncLoadImage(url, resolve, reject) { return new Promise(function(resolve, reject){ //.... }); }
由於必需要經過then()
,才能將方法添加到Promise
中。
咱們前端開發過程當中,最經常使用的數據交互方式就是Ajax
,Ajax
就是事件驅動的異步編程,咱們如今用Promise
來實現一個Ajax
操做。
var post = function(option) { var promise = new Promise(function(resolve, reject){ var client = new XMLHttpRequest(); client.open("POST", option.url); client.onreadystatechange = handler; client.responseType = "json"; client.setRequestHeader("Accept", "application/json"); client.send(option.data); function handler() { if (this.readyState !== 4) { return; } if (this.status === 200) { resolve(this.response); } else { reject(new Error(this.statusText)); } }; }); return promise; }; post({ url: 'www.lingxiao.site/es6/post', data: json, }).then(function(result){ console.log(result); },function(error){ console.log("Error:"+error); });
這樣咱們就實現了一個簡單的Ajax
方法。
沒有最後