zoukankan      html  css  js  c++  java
  • 浅谈异步编程之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);
      });
    }
  • 相关阅读:
    苹果将首次采用HTML5直播发布会 狼人:
    Python 3.2 alpha 2发布 狼人:
    下一代Linux文件系统Btrfs走向成熟 狼人:
    Hello! 404 狼人:
    退格回车控制台输入密码
    poj 3233 Matrix Power Series
    地址参考clang: error: linker command failed with exit code 1 (use v to see invocation)
    文本截断JQuery为textarea添加maxlength,并且兼容IE
    代码下载Html5初探视频元素video示例
    c# 限制textbox的输入范围和长度(长度不用maxlength方法)
  • 原文地址:https://www.cnblogs.com/wjrelax/p/13230958.html
Copyright © 2011-2022 走看看