Node-03.异步之Promise

1,423 阅读2分钟

1.promise:

promise顾名思义,承诺的意思,承诺你呢,现在还得不到一个结果,未来给你结果,雾草,渣男

  • 当前事件循环得不到的结果,但未来的事件循环会给你结果

  • 状态机:

    • pending
    • fulfilled/resolved
    • rejected

🚀 1.状态机简单代码示例:

var promise = new Promise(function (resolve, reject) {
  setTimeout(()=>{
    resolve();
  },500)
});
console.log(promise);
setTimeout(() => {
  console.log(promise);
},800);

执行 node index.js后结果如下图:

通过立即执行函数在控制台运行结果:

(function () {
  var promise = new Promise(function (resolve, reject) {
    setTimeout(() => {
      resolve();
    }, 500);
  });
  console.log(promise);
  setTimeout(() => {
    console.log(promise);
  }, 800);
})();

控制台结果如下图:

2..then.catch用法:

  • resolved状态的Promise会回调后面的第一个.then
  • rejected状态的Primise会回调后面的第一个.catch
  • .then.catch方法中的return的结果会被包装为promise
  • 任何一个rejected状态且后面没有.catchpromise,都会造成浏览器/node环境的全局错误

3.使用promise解决异步回调地狱问题:

🚀例子1:primise的基本使用:

(function(){
  var promise = interview();
  promise.then((res)=>{
    console.log('哇~幸福来得太突然了');
  }).catch((err)=>{
    console.log('失败了,再来',err);
  });
  function interview(){
    return new Promise((resolve,reject)=>{
      setTimeout(()=>{
        if(Math.random() > 0.2){
          resolve('表白成功了')
        }else{
          reject(new Error('表白失败了'))
        }
      },500)
    })
  }
})();

🚀例子2:回调函数return promise的情况

(function(){
  var promise = interview();
  var promise2 = promise.then((res)=>{
    return new Promise(function(resolve,reject){
      setTimeout(()=>{
        resolve('第二次表白了')
      },400)
    })
  });
  setTimeout(()=>{
    console.log(promise);
    console.log(promise2);
  },800);
  setTimeout(()=>{
    console.log(promise);
    console.log(promise2);
  },1000);

  function interview(){
    return new Promise((resolve,reject)=>{
      setTimeout(()=>{
        if(Math.random() > 0.2){
          resolve('表白成功了')
        }else{
          reject(new Error('表白失败了'))
        }
      },500)
    })
  }
})();
  • 执行interview需要400毫秒,进入第二次告白需要等500毫秒,一共是900毫秒
  • 通过在8001000毫秒时打印promisepromise2;会发现800毫秒时的promise2出于pending,而在1000毫秒时转为fulfilled

🚀例子3:多次表白的情况:

(function () {
  var promise = interview(1)
    .then(() => {
      return interview(2);
    })
    .then(() => {
      return interview(3);
    })
    .then(() => {
      console.log('哇,终于等到你~!');
    })
    .catch((err) => {
      console.log('我在第' + err + '次表白的时候失败了');
    });

  function interview(round) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        if (Math.random() > 0.2) {
          resolve('表白成功了');
        } else {
          var error = new Error('fail');
          error.round = round;
          //记录表白失败的轮次数
          reject(round);
        }
      }, 500);
    });
  }
})();

结果如下图:

🚀例子4:并发问题的处理

(function () {
  Promise.all([interview('腾讯'), interview('阿里'), interview('京东')]).then(()=>{
    console.log('面试都通过了呢')
  }).catch(
    (err) => {
      console.log('我在' + err + '的面试失败了');
    }
  );

  function interview(name) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        if (Math.random() > 0.2) {
          resolve('表白成功了');
        } else {
          var error = new Error('fail');
          error.round = name;
          //记录表白失败的轮次数
          reject(name);
        }
      }, 500);
    });
  }
})();