1. 什么是promise
promise抽象異步處理對象以及對其進(jìn)行各種操作的組件.js中處理異步一般都是通過回調(diào)如下:
getAsync("fileA.txt", function(error, result){ if(error){// 取得失敗時(shí)的處理 throw error; } // 取得成功時(shí)的處理 });
Promise則是把類似的異步處理對象和處理規(guī)則進(jìn)行規(guī)范化,并按照統(tǒng)一的接口來寫,不按規(guī)范寫就會出錯(cuò).promise實(shí)現(xiàn)上訴異步處理:
var pro = new promise(function(resolve,reject){ if(error){ reject(); }else{ resolve(); } }); pro.then(function(){ //when sucess happens do something }).catch(function(){ //when error happens do something })
2. 兼容性
我們要用一個(gè)東西肯定先考慮兼容啊,promise是es6里邊的,所以兼容還是個(gè)問題,不過我們在此可以引用使之兼容的Polyfill類庫如YUI的ypromise或es6-promise
3. promise的用法
- 創(chuàng)建promise對象:我們通過new Promise(fn)來創(chuàng)建一個(gè)promise對象,fn接受兩個(gè)參數(shù) resolve和reject,當(dāng)異步處理正常時(shí)調(diào)用resolve否則調(diào)用reject 下邊是一個(gè)創(chuàng)建xhr的promise例子:
function getURL(URL) { return new Promise(function (resolve, reject) { var req = new XMLHttpRequest(); req.open('GET', URL, true); req.onload = function () { if (req.status === 200) { resolve(req.responseText); } else { reject(new Error(req.statusText)); } }; req.onerror = function () { reject(new Error(req.statusText)); }; req.send(); }); } var URL = "http://httpbin.org/get"; getURL(URL).then(function onFulfilled(value){ console.log(value); }).catch(function onRejected(error){ console.error(error); }); Promise.resolve(value),快速創(chuàng)建promise對象,是new Promise(function(resolve){
resolve(value);
})`
的語法糖。Promise.reject(value)用法同上 - 在Promise里可以將任意個(gè)方法連在一起作為一個(gè)方法鏈
aPromise.then(function taskA(value){ // task A }).then(function taskB(vaue){ // task B }).catch(function onRejected(error){ console.log(error); });
我們可以通過Promise方法鏈方式來編寫能以taskA → task B 這種流程進(jìn)行處理的邏輯了。
先這樣吧