浅谈异步编程之Promise

异步编程之Promise

Promise简单的来说就是当前时间得不到的结果,但未来的事件循环会给到你结果,用于一个异步操作的最终完成及结果值的表示。

语法:

    new Promise(function(resolve,reject){
      ...
      ...
   })
    .then(){
      ...
    }
    .catch

Promise有三个状态

pending:还没有得到结果的状态,可以转换为fulfilled/resolved/rejected;

fulfilled/resolved:得到了一个正确的结果,意味着操作成功完成。

rejected:得到了一个错误的结果,意味着操作失败;

 

Promise.resolve()返回一个fulfilled状态的Promise实例,或者原始Promise实例

 1、参数为空,返回一个状态为fulfilled的Promise实例

 2、参数是一个跟Promise无关的值,同样是返回一个状态为fulfilled的Promise实例,或者原始Promise实例,但是fulfilled响应函数会得到这个参数

 3、参数为Promise实例,则返回该实例,不做任何修改

 4、参数为thenable,则立刻执行.then()

Promise.reject()不认thable,返回一个rejected的Promise实例。

任何一个rejected状态且后面没有.catch()的Promise,都会造成浏览器/Node环境的全局错误

 

  (function () {
    var promise = new Promise(function (resolvereject) {
      setTimeout(() => {
        // resolve(3);
        reject(new Error(3));
      }, 300);
    })
      .then(function (res) {
          console.log("then");
        console.log(res);
      })
      .catch(function (err) {
          console.log("catch");
        console.log(err);
      });

    console.log(promise);

    setTimeout(() => {
      console.log(promise);
    }, 800)

  })();

 

执行catch呵then都可以返回一个全新的Promise,该Promise最终状态根据then和catch的回调函数执行结果决定。

如果回调函数最终是throw,该Promise是rejected状态

如果该回调函数最终是return,该Promise是resolved状态

 

(function () {
  var promise = interView();
  var promise2 = promise
    .then((res=> {
      // console.log("accept");
      throw new Error("refuse");
      // return "success";
    })
    .catch((err=> {
      // console.log("error");
      throw new Error("refuse");
      // return "success";
    });

  setTimeout(() => {
    console.log(promise);
    console.log(promise2);
  }, 800);

  var promise = interView(1)
    .then(() => {
      return interview(2);
    })
    .then(() => {
      return interview(3);
    })
    .then(() => {
      console.log("smile");
    })
    .catch((err=> {
      console.log("error");
    });

 

Promise.all([p1,p2,p3,...])

用于将多个Promise实例包装成一个新的Promise实例,返回的实例就是普通的Promise

接受一个数组作为参数

数组里可以实Promise对象,也可以是别的值,只有Promise会等待状态改变

当所有子Promise都完成,该Promise完成,返回值是全部值 的数组

有任何一个失败,该Promise失败,返回值是第一个失败的子Promise的错误

  

Promise.all([
    interView('geekbang'),
    interView('tencent')
  ])
  .then(()=>{
    console.log('smile');
  })
  .catch((err)=>{
    console.log(err.name)
  })
})();

function interView(name) {
  return new Promise((resolvereject=> {
    setTimeout(() => {
      if (Math.random() > 0.2) {
        resolve("success");
      } else {
        var error=new Error('fail');
        error.name=name;
         reject(error);
      }
    }, 800);
  });
}

 

posted @ 2020-07-03 16:02  绳命如此井猜  阅读(181)  评论(0编辑  收藏  举报