Promise是異步編程的一種解決方案ajax
異步編程有如下四種:編程
特色json
缺點:數組
let myPromise = new Promise(function (resolve,reject) { console.log('當即執行') if (異步操做成功) { resolve(value) }else { reject(error) } })
// 下面舉一個簡單的ajax請求的例子 let myPromise = new Promise(function (resolve,reject) { $.ajax({ succeed:function () { resolve(value) }, error: function () { reject(error) } }) }) myPromise.then(function (value) { //請求成功後續的操做,這裏也能夠作後續的異步操做 },function (error) { //請求失敗後續的操做,該函數可選 })
let promise = new Promise(function(resolve, reject) { console.log('Promise'); resolve(); }); promise.then(function() { console.log('resolved.');//這裏是異步操做,因此是最後輸出 }); console.log('Hi!'); // Promise // Hi! // resolved
getJSON("/posts.json").then(function(json) { return json.post;//將json.post傳給後面的then回調函數 }).then(function(post) { // ... });
const getJSON = function(url) { const promise = new Promise(function(resolve, reject){ const handler = function() { if (this.readyState !== 4) { return; } if (this.status === 200) { resolve(this.response); } else { reject(new Error(this.statusText)); } }; const client = new XMLHttpRequest(); client.open("GET", url); client.onreadystatechange = handler; client.responseType = "json"; client.setRequestHeader("Accept", "application/json"); client.send(); }); return promise; }; getJSON("/post/1.json").then(function(post) { return getJSON(post.commentURL); //這裏手動返回一個Promise對象,後面then的回調函數funcA和funcB執行哪個,取決該返回的Promise的狀態 }).then(function funcA(comments) { console.log("resolved: ", comments); }, function funcB(err){ console.log("rejected: ", err); }); //用箭頭函數寫則簡明不少: getJSON("/post/1.json").then( post => getJSON(post.commentURL) ).then( comments => console.log("resolved: ", comments), err => console.log("rejected: ", err) );
const promise = new Promise(function(resolve, reject) { throw new Error('err');//若是拋出錯誤是在resolve以後,catch就不會捕捉到錯誤,由於Promise 狀態已經變成resolved,再拋出錯誤是無效的 resolve('test') }).then((value)=>{ console.log(value) },(err)=>{ console.log(err) }); promise.catch(function(error) { console.log(error); });
function timeout(ms) { return new Promise((resolve, reject) => { setTimeout(resolve, ms, 'done'); }); } timeout(2000).then((value) => { throw new Error('test1'); console.log(value); }, (value) => { throw new Error('test2'); console.log(value+1);//不會執行 } ).catch((err)=>{ console.log(err+2); //test12 });
// 很差的作法 promise .then(function(data) { // success }, function(err) { // error }); // 好的作法,這樣能夠捕捉前面的then內部拋出的錯誤 promise .then(function(data) { //cb // success }) .catch(function(err) { // error });
const p = Promise.race([p1, p2, p3]);
let thenable = { then: function(resolve, reject) { resolve(42); } }; let p1 = Promise.resolve(thenable); p1.then(function(value) { console.log(value); // 42 });
//這樣能夠獲得一個Promise對象 const p = Promise.resolve(); p.then(function () { // ... });
const thenable = { then(resolve, reject) { reject('出錯了'); } }; Promise.reject(thenable) .catch(e => { console.log(e === thenable) //這裏捕獲的是thenable對象,而不是‘出錯了’字符串,不像Promise.resolve會執行thenable對象的then方法 })
const f = () => console.log('now'); Promise.try(f); console.log('next'); // now // next