promise

說說promise吧, promise 承諾。Promise的理解就是 我對你作出承諾,我怎麼怎麼,而後我有可能成功,我作到了, 有可能失敗, 我沒作到, 就是這麼個東西.(說的玄一點, 這是一個異步流程控制的一個東東, 至於什麼是異步流程控制?我不知道)promise

new Promise((resolve, reject)=>{})

Promise的狀態變化有兩種, 從pending —> fulfilled或者 pending—>rejected異步

pending 是初始的狀態, fulfilled 是成功的狀態, 剩下的就是失敗的狀態rejected函數

Promise會當即執行, 可是狀態的改變須要咱們來操做。prototype

let abcc = new Promise((resolve, reject)=> {
  console.log('當即執行了')
  setTimeout(()=>{
   resolve('ccc')
  },1000)
  setInterval(()=> {
    console.log(abcc)
  },200)
  console.log('當即執行了2')
})

thenrest

當Promise的狀態發生改變,使用then方法來觸發對應的處理方法.code

兩個參數: then方法包含兩個參數, 對應當Promise的狀態爲fulfilled和rejected的回調函數對象

省略參數: 將建立一個沒有其餘處理程序的新的Promise,繼承Promise最終的狀態, then被調用, 第幾個參數省略,Promise將採用那個狀態繼承

因爲then方法返回的是一個新的Promise對象, 因此不會影響到當前的Promise對象,因爲返回來的是Promise,因此then後面能夠then, then, then….無窮無盡,這樣完美的避免了 回調地獄.回調函數

let o1 = new Promise((resolve,reject) => {
   resolve(1)
})

o1.then((value)=>{
    console.log('value'+ value)   // 1
    console.log(o1)    // resolved 1
   value +=1;
   return value;
}).then((value)=>{
   console.log(value)      //2
console.log(o1)   //resolved 1 
})

catchio

由於咱們寫的是程序, 因此常常要考慮程序出錯的緣故. 就把rejected的函數捕捉給暴露出來了就是所謂的catch, 當狀態變爲rejected的時候, catch被調用

其實catch就是下面的縮寫

Promise.prototype.then(undefined, onRejected)

看下下面這個

var p1 = new Promise(function(resolve, reject) {
  resolve('Success');
});

p1.then(function(value) {
  console.log(value); // "成功!"
  throw 'oh, no!'; or   return Promise.reject('oh no ')
}).catch(function(e) {
  console.log(e); // "oh, no!"  
}).then(function(){
  console.log('after a catch the chain is restored');
}, function () {
  console.log('Not fired due to the catch');
});

catch返回的Promise狀態, 因爲catch是then(undefined, onrejected)的縮寫, 第一個參數爲空, 因此catch返回的Promise狀態爲成功

Promise.reject(reson)

返回一個用reason拒絕的Promsie

let o = Promise.reject('sss');
o.catch((reason) => {
  console.log(reason)     // sss
}).then(()=> {
 console.log('resolve')    // 返回這個 理由在上面本身找
}, ()=> {
  console.log('reject')
})

Promise.resolve()

Promise.resolve(value); 正常解析
Promise.resolve(promise);  根據promise的狀態來往下傳遞
Promise.resolve(thenable);  根據then的狀態來往下傳遞

Promise.resolve("Success").then(function(value) {
  console.log(value); // "Success"
}, function(value) {
  // 不會被調用
})

Promise.all()

當全部參數中的promise都完成, 或者任意一個promise的狀態變成reject,返回promise

let o1 = new Promise((resolve,reject)=>{
   resolve('1')
})

let o2 = new Promise((resolve,reject)=>{
   resolve('2')
})

let o3 = new Promise((resolve,reject)=>{
   setTimeout(()=> {
     resolve('3')
   }, 3000)
})

Promise.all([o1, o2, o3]).then((value)=>{
  console.log(value)
}).catch((reason)=>{
  console.log(reason)
})

Promise.race()

和all相反, 只要有一個狀態改變, 就會返回

能夠講上面的all換成race來玩玩.

相關文章
相關標籤/搜索