Promise 僅僅只是個對象,主要用它來處理異步的數據html
在Promise中,有三種狀態node
pending(等待,處理中)--》resolve(完成)ajax
或promise
pending(等待,處理中)--》rejected(失敗)異步
即一旦狀態改變,就不會再變,任什麼時候候均可以獲得這個結果。函數
若是不設置回調函數,Promise
內部拋出的錯誤,不會反應到外部測試
參數:ui
resolve:成功時觸發的回調函數
reject:失敗時觸發的回調函數
建立Promise對象url
const pro = new Promise(function(resolve,reject){ if(/*成功*/){ resolve(value); //value爲成功時,傳出的值 }else{ reject(err); //err爲失敗時,傳出的值 } })
Promise建立的實例,能夠調用then來接收pro的值,並執行對應的回調函數spa
寫法
//調用then方法
pro.then(function(val){ //成功時,調用成功的回調函數
console.log("成功時,接收數據爲"+val) //成功時,接收數據爲123
},function(err){ //失敗時,調用失敗的回調函數
console.log("失敗時,接收數據爲"+err)
})
調用then方法後返回的仍是Promise對象,而後又能夠調用then方法
const pro = new Promise(function(resolve,reject){
if(123){
resolve(123);
}else{
reject(456);
}
})
pro.then(function(val){ //成功時,調用成功的回調函數
console.log("成功時,接收數據爲"+val)
return val //鏈式調用then時須要return val,將值傳遞到下一層回調函數
},function(err){ //失敗時,調用失敗的回調函數
console.log("失敗時,接收數據爲"+err)
}).then(function(val){
console.log("又是成功時調用了then"+val) //成功時,接收數據爲123
},function(err){
console.log("又是失敗時調用了then"+err) //又是成功時調用了then123
})
寫法
const pro = new Promise(function(resolve,reject){ reject("錯誤") }) pro.then(function(){}).catch(function(err){ console.log(err) //錯誤 })
或
pro.catch(function(err){ console.log(err) //錯誤 })
resolve()返回一個成功時的Promise對象
reject()返回一個失敗時的Promise對象
寫法
const pro = Promise.reject("錯誤");
const pro2 = Promise.resolve("成功");
const pro3 =Promise.resolve(pro2);
pro.then(function(val){ console.log(val) },function(err){ console.log(err) //錯誤
})
pro2.then(function(val){
console.log(val) //成功
})
pro3.then(function(val){
console.log(val) //成功
})
做爲參數的幾個promise對象一旦有一個的狀態爲rejected,則all的返回值就是rejected。
寫法:
例子1
const pro = Promise.reject("錯誤"); const pro2 = Promise.resolve("成功") const pro3 = Promise.resolve("成功") Promise.all([pro,pro2,pro3]).then(function(val){ console.log(val) },function(err){ console.log(err) //錯誤 })
例子2
const pro = Promise.resolve("成功"); const pro2 = Promise.resolve("成功") const pro3 = Promise.resolve("成功") Promise.all([pro,pro2,pro3]).then(function(val){ console.log(val) // ["成功", "成功", "成功"] },function(err){ console.log(err) })
哪一個Promise對象傳值較快就接收哪一個
例子
const p1 = new Promise(function(resolve,reject){ setTimeout(resolve,100,"100") }) const p2 = new Promise(function (resolve,reject){ setTimeout(resolve,500,"500") }) Promise.race([p1,p2]).then(function(val){ console.log(val) })
Promise對象在node中的玩法之一
let fs = require('fs') fs.readFile('./01.html','utf8',(err,data) => { var por = new Promise((resolve,reject) =>{ if(err){ reject(err) }else{ resolve(data) } }) por.then(function(val){ console.log(val) },function(err){ console.log(err) }) })
成功時
let fs = require('fs') fs.readFile('./01dff.html','utf8',(err,data) => { var por = new Promise((resolve,reject) =>{ if(err){ reject(err) }else{ resolve(data) } }) por.then(function(val){ console.log(val) },function(err){ console.log(err) }) })
失敗時
Promise與ajax組合運用
<body> <button id="btn">測試</button> <div id="box"></div> <script> var btn = document.getElementById('btn') var box = document.getElementById('box') function ajax(url,res,rej) { var xhr; if (window.XMLHttpRequest){ xhr=new XMLHttpRequest(); } else{ xhr=new ActiveXObject("Microsoft.XMLHTTP"); } xhr.open('GET',url,true) xhr.send() xhr.onload = function () { if (xhr.status == 200 && xhr.readyState == 4) { res(xhr.responseText); } else { rej(xhr.status) } } } btn.onclick = function(){ var pro = new Promise((resolve,reject) => { ajax("01.txt",function(data){ resolve(data) },function(err){ reject(err) }) }) pro.then(function(data){ box.innerHTML = data; },function(err){ box.innerHTML = err; }) } </script> </body>
ajax發送請求成功時:
ajax失敗時
<body> <button id="btn">測試</button> <div id="box"></div> <script> var btn = document.getElementById('btn') var box = document.getElementById('box') function ajax(url,res,rej) { var xhr; if (window.XMLHttpRequest){ xhr=new XMLHttpRequest(); } else{ xhr=new ActiveXObject("Microsoft.XMLHTTP"); } xhr.open('GET',url,true) xhr.send() xhr.onload = function () { if (xhr.status == 200 && xhr.readyState == 4) { res(xhr.responseText); } else { rej(xhr.status) } } } btn.onclick = function(){ var pro = new Promise((resolve,reject) => { ajax("01.fsdft",function(data){ resolve(data) },function(err){ reject(err) }) }) pro.then(function(data){ box.innerHTML = data; },function(err){ box.innerHTML = err; }) } </script> </body>