使用

  1. var p = new Promise(function(resolve, reject){
  2. console.log('执行')
  3. setTimeout(function(){
  4. resolve(2)
  5. }, 1000)
  6. })
  7. p.then(function(res){
  8. console.log('suc',res)
  9. },function(err){
  10. console.log('err',err)
  11. })

手写 Promise

  1. function Promise(executor) {
  2. var _this = this;
  3. this.status = 'pending'; // 状态
  4. this.value = undefined; // 成功结果
  5. this.reason = undefined; // 失败原因
  6. function resolve(value){ this.state = 'fullfilled' }
  7. function reject(reason){ this.state = 'rejected' }
  8. executor(resolve, reject);
  9. }
  10. Promise.prototype.then = function(onFullfilled, onRejected){
  11. if(this.state === 'fullfilled'){
  12. onFullfilled(this.value)
  13. }
  14. if(this.state === 'rejected'){
  15. onRejected(this.reason)
  16. }
  17. }
  18. module.exports = Promise;

promise.all

  1. Promise.all = (promises) => {
  2. return new Promise((rs, rj) => {
  3. let count = 0;
  4. let len = promises.length;
  5. let result = [];
  6. if(len === 0) return rs([])
  7. promises.forEach((item, index) => {
  8. Promise.resolve(p).then(res => {
  9. count +=1;
  10. result[i] = res;
  11. if(count === len) return rs([])
  12. })
  13. }).catch(rj)
  14. })
  15. }

取消Promise方法

  1. 当新对象保持“pending”状态时,原Promise链将会中止执行。 ```javascript Promise.resolve().then(() => { console.log(‘ok1’) return new Promise(()=>{}) // 返回“pending”状态的Promise对象 }).then(() => { // 后续的函数不会被调用 console.log(‘ok2’) }).catch(err => { console.log(‘err->’, err) })
  1. 2. Promise.race竞速方法
  2. ```javascript
  3. let p1 = new Promise((resolve, reject) => {
  4. resolve('ok1')
  5. })
  6. let p2 = new Promise((resolve, reject) => {
  7. setTimeout(() => {resolve('ok2')}, 10)
  8. })
  9. Promise.race([p2, p1]).then((result) => {
  10. console.log(result) //ok1
  11. }).catch((error) => {
  12. console.log(error)
  13. })

**3. 当Promise链中抛出一个错误时,错误信息沿着链路向后传递,直至被捕获

  1. Promise.resolve().then(() => {
  2. console.log('ok1')
  3. throw 'throw error1'
  4. }).then(() => {
  5. console.log('ok2')
  6. }, err => {
  7. // 捕获错误
  8. console.log('err->', err)
  9. }).then(() => {
  10. // 该函数将被调用
  11. console.log('ok3')
  12. throw 'throw error3'
  13. }).then(() => {
  14. // 错误捕获前的函数不会被调用
  15. console.log('ok4')
  16. }).catch(err => {
  17. console.log('err->', err)
  18. })