• 浅谈异步编程之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);
      });
    }
  • 相关阅读:
    Notepad++快捷键
    NAT123内网映射端口
    Maven 导出依赖Jar,生成source.jar,javadoc.jar
    自定义javascript log方法
    AmazeUI定制
    模板框架
    jquery checkbox全选 获取值
    首页导航点击A连接跳转并添加上背景色,
    Controller中的方法利用ip跨域访问
    Datatable转成List
  • 原文地址:https://www.cnblogs.com/wjrelax/p/13230958.html
Copyright © 2020-2023  润新知