1. 程式人生 > >promise學習總結

promise學習總結

增加 turn star code 全局變量 function 新的 ESS resolv

什麽是Promise

Promise是異步編程的一種解決方案,它有三種狀態,分別是pending-進行中resolved-已完成rejected-已失敗

當Promise的狀態又pending轉變為resolved或rejected時,會執行相應的方法,並且狀態一旦改變,就無法再次改變狀態,這也是它名字promise-承諾的由來

直接上案例了,在案例中理解:

最簡單的promise

new Promise(resolve =>{
  setTimeout(()=>{
    resolve(‘hello‘)
  },2000);
}).then(value=>{
  console.log(value 
+ ‘world‘); })
分兩次,順序執行
console.log(‘start‘);
new Promise(resolve => {
  setTimeout(() => {
    resolve(‘hello‘);
  }, 2000);
})
  .then(value => {
    console.log(value);
    return new Promise(resolve => {
      setTimeout(() => {
        resolve(‘world‘);
      }, 2000)
    });
  })
  .then(value 
=> { console.log(value + ‘ world‘); }); // 結果 // start // hello (2s) // worldworld (4s)
假如一個promise已經完成,再.then()會怎樣
console.log(‘start‘);

let promise = new Promise(resolve=>{
  setTimeout(()=>{
    console.log(‘this promise fullfilled‘);
    resolve(‘hello,world‘)
  },2000);
});

setTimeout(()
=>{ promise.then(value=>{ console.log(value); }) },4000) // 結果 // start // this promise fullfilled (2s) // hello,world (4s) //在任何地方生成一個promise後,可以存為一個變量,不管該promise有完成,都會依次根據隊列執行

假如在 .then() 的函數裏面不返回新的 Promise, 會怎樣?
console.log(‘start‘);
new Promise(resolve => {
  setTimeout(() => {
    resolve(‘hello‘)
  }, 2000);
})
  .then(value => {
    console.log(value);
    (function () {
      return new Promise(resolve => {
        setTimeout(() => {
          console.log(‘第二個promise‘);
          resolve(‘Merry‘)
        }, 2000);
      })
    }());
    return false;
  })
  .then(value => {
    console.log(value + ‘world‘);
  })


  // 結果
    // start 
    // hello  (2s)
    // falseworld (2s)
    // 第二個promise (4s)

      //.then() 的函數裏面不返回新的 Promise,會默認執行下一個環節,即使你直接返回了false,也會執行

  // 備註
    // 匿名函數,(function(){})();立即執行,主要利用函數內的變量作用域,避免產生全局變量,影響整體頁面環境,增加代碼的兼容性。

.then()接受兩個函數作為參數,分別代表fulfilled和rejected .then()返回一個新的promise實例,所以它可以鏈式調用 狀態相應函數可以返回新的promise或其他值,如果返回新的Promise,那麽下一級.then()會在新的Promise狀態改變後執行 !!如果返回其他任何值,則會立即執行下一級.then()
.then()裏面有.then()的情況 會等裏面的.then()執行完,再執行外面的。最好不要這樣寫,依次展開效果一樣
new Promise(resolve => {
  console.log(‘start‘);
  setTimeout(() => {
    console.log(‘1‘);
    resolve(‘1‘);
  }, 1000)
})
  .then(value => {
    return new Promise(resolve => {
      setTimeout(() => {
        console.log(‘1-1‘);
        resolve(‘1-1‘);
      }, 1000)
    })
      .then(value => {
        console.log(‘1-2‘);
        return value;
      })
      .then(value => {
        console.log(‘1-3‘);
        return value;
      })
  })
  .then(value => {
    console.log(‘2‘);
  })

/*
  結果:
    start
    1
    1-1
    1-2
    1-3
    2
*/

錯誤處理兩種做法: Promise會自動捕獲內部異常,並交給rejected響應函數處理 1.reject(‘錯誤信息‘).then(null,message=>{}) 2.throw new Error(‘錯誤信息‘).catch(message=>{}) 推薦時候用第二種,更加清晰,並且可以捕獲前面的錯誤
console.log(‘go‘);
new Promise((resolve,reject)=>{
  setTimeout(()=>{
    reject(‘bye‘)
    // throw new Error(‘bye‘);
  },1000)
})
  .then(value=>{
    console.log(value+‘world‘);
  })
  .catch(error=>{
    console.log(‘error:‘,error);
  })

  // go
  // error: bye

.catch() + .then()連用 .catch()也會返回一個promise實例 建議在所有隊列後面都加上.catch()
console.log(‘go‘);
new Promise(resolve=>{
  setTimeout(() => {
    resolve(‘‘);
  }, 1000);
})
  .then(()=>{
    console.log(‘start‘)
    throw new Error(‘test error‘);   
  })
  .catch((err)=>{
    console.log(‘I catch:‘+ err);
    
    // 下面一行代碼的註釋講引發不同的走向
    throw new Error(‘another error‘);  
  })
  .then(()=>{
    console.log(‘arrive here‘);
  })
  .then(()=>{
    console.log(‘and here‘);
  })
  .catch((err)=>{
    console.log(‘I catch:‘+ err);
  })

/*
  結果一:
    go
    start
    I catch:Error: test error
    arrive here
    and here
  結果二:
    go
    start
    I catch:Error: test error
    I catch:Error: another error

*/ 

Promise.all([p1,p2,p3,...]); 批量同時執行多個promise實例,包裝成一個新的promise實例,返回的是所有promise結果組成的數組
console.log(‘go‘);
Promise.all([1,2,3])
.then(all=>{
  console.log(‘1:‘,all);
  return Promise.all([function(){
    console.log(‘ooxx‘);
  },‘xxoo‘,false])
})
.then(all =>{
  console.log(‘2:‘,all);
  let p1 = new Promise(resolve=>{
    setTimeout(() => {
      resolve(‘I`m P1‘);
    }, 1000);
  });
  let p2 = new Promise(resolve=>{
    setTimeout(() => {
      resolve(‘I`m P2‘);
    }, 3000);
  });
  return Promise.all([p1,p2]);
})
.then(all =>{
  console.log(‘3:‘,all);
  let p1 = new Promise(resolve=>{
    setTimeout(() => {
      resolve(‘I`m P1‘);
    }, 1000);
  });
  let p2 = new Promise((resolve,reject)=>{
    setTimeout(() => {
      reject(‘I`m P2‘);
    }, 1000);
  });
  let p3 = new Promise((resolve,reject)=>{
    setTimeout(() => {
      reject(‘I`m P3‘);
    }, 1500);
  });
  return Promise.all([p1,p2,p3]);
})
.then(all=>{
  console.log(‘all:‘,all);
})
.catch(err=>{
  console.log(‘catch‘,err);
  
})

/*
  結果:
  go 
  1: [ 1, 2, 3 ] 
  2: [ [Function], ‘xxoo‘, false ]
  3: [ ‘I`m P1‘, ‘I`m P2‘ ]   
  catch I`m P2
*/ 

promise學習總結