Promise

Posted HUMILITY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Promise相关的知识,希望对你有一定的参考价值。

promise

  • ES6中一个非常好用和重要的特性
  • Promise是异步编程的一种方案
  • 什么时候用?

    • 一般情况下是有异步操作时,使用Promise对这个异步操作进行封装
    • Promise需传入俩个参数,resolve(成功时调用),reject(失败时调用)

          new Promise((resolve, reject) => {
              setTimeout(() => {
                  // 成功的时候调用resolve
                  // resolve(\'hello world\')
                  // 失败的时候调用reject
                        reject(\'error message\')
                    }, 1000)
                }).then((data) => {
           // 1.100行处理的代码
           console.log(data);
           console.log(data);
           console.log(data);
           console.log(data);
           console.log(data);
           console.log(data);
                }).catch((err) => {
           console.log(err)
                })    //输出 error message
      

Promise三种状态

  • 当开发中有异步操作时,就可以给异步操作包装一个Promise
  • 异步操作之后会有三种状态

    • pending:等待状态,比如正在进行网络请求,或者定时器没有到时间
    • fulfill:满足状态,当我们主动回调了resolve时,就处于该状态,并且会回调.then()
    • reject:拒绝状态,当我们主动回调了reject时,就处于该状态,并且会回调.catch()

              new Promise((resolve,reject)=>{
                  setTimeout(()=>{
                      resolve(\'hlwd\')
                      reject(\'error\')
                  },1000)
              }).then(data => {
                  console.log(data);
              },err => {
                  console.log(err)
              })
      

Promise的链式调用

    new Promise((resolve, reject) => {
        // 第一次网络请求的代码
        setTimeout(() => {
            resolve()
        }, 1000)
    }).then(() => {
        // 第一次拿到结果的处理代码
        console.log(\'hellowd\')
        console.log(\'hellowd\')
        console.log(\'hellowd\')
        console.log(\'hellowd\')
        console.log(\'hellowd\')
        console.log(\'hellowd\')

        return new Promise((resolve, reject) => {
            // 第二次网络请求的代码
            setTimeout(() => {
                resolve()
            }, 1000)
        })
    }).then(() => {
        // 第二次拿到结果的代码
        console.log(\'hellow\')
        console.log(\'hellow\')
        console.log(\'hellow\')
        console.log(\'hellow\')
        console.log(\'hellow\')
        console.log(\'hellow\')


        return new Promise((resolve, reject) => {
            // 第三次网络请求的代码
            setTimeout(() => {
                resolve()
            })
        },1000)
    }).then(() => {
        // 第三次拿到结果的代码
        console.log(\'hellowd\')
        console.log(\'hello\')
        console.log(\'hello\')
        console.log(\'hello\')
        console.log(\'hello\')
        console.log(\'hello\')
    })

  • 简化代码方式:

      // 网络请求:aaa -> 自己处理(十行)
      // 处理:aaa111 -> 自己处理(十行)
      // 处理:aaa111222 -> 自己处理
      new Promise((resolve, reject) => {
          setTimeout(() => {
              resolve(\'aaa\')
          }, 1000)
      }).then((res) => {
          // 1.自己处理10行代码
          console.log(res, \'第一次的十行处理代码\');
    
          //2.对结果进行第一次处理
          return new Promise((resolve) => {
              resolve(res + \'111\')
          })
      }).then((res) => {
          console.log(res, \'第二次的十行处理代码\');
    
          return new Promise((resolve) => {
              resolve(res + \'222\')
          })
      }).then((res) => {
          console.log(res, \'第三次的10行处理代码\');
      })
      
    
    // SIMPLE WRITTEN
     new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(\'aaa\')
        }, 1000)
    }).then((res) => {
        // 1.自己处理10行代码
        console.log(res, \'第一次的十行处理代码\');

        //2.对结果进行第一次处理
        return Promise.resolve(res + \'111\')

    }).then((res) => {
        console.log(res, \'第二次的十行处理代码\');

        return Promise.resolve(res + \'222\')
    }).then((res) => {
        console.log(res, \'第三次的10行处理代码\');
    })
    
    // SIMPLE WRITTEN 2
    new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(\'aaa\')
        }, 1000)
    }).then((res) => {
        // 1.自己处理10行代码
        console.log(res, \'第一次的十行处理代码\');

        //2.对结果进行第一次处理
        return res + \'111\'

    }).then((res) => {
        console.log(res, \'第二次的十行处理代码\');

        return res + \'222\'
    }).then((res) => {
        console.log(res, \'第三次的10行处理代码\');
    })

    //报错
      new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(\'aaa\')
        }, 1000)
    }).then((res) => {
        // 1.自己处理10行代码
        console.log(res, \'第一次的十行处理代码\');

        //2.对结果进行第一次处理
        return Promise.reject(\'报错\')
        //or
        //throw \'报错\'


    }).then((res) => {
        console.log(res, \'第二次的十行处理代码\');

        return Promise.resolve(res + \'222\')
    }).then((res) => {
        console.log(res, \'第三次的10行处理代码\');
    }).catch((eerr) => {
        console.log(eerr);
    })
    

Promise的all方法

  • 加入某一需求要发送两次请求才能完成

          Promise.all([
          new Promise((resolve, reject) => {
              setTimeout(() => {
                  resolve(\'result\')
              }, 2000)
          }),
          new Promise((resolve, reject) => {
              setTimeout(() => {
                  resolve(\'result2\')
              }, 1000)
          })
    
      ]).then(results => {
          console.log(results);
      })
    

以上是关于Promise的主要内容,如果未能解决你的问题,请参考以下文章

前端面试题之手写promise

什么时候然后从Promise.all()的子句运行?

Typescript编译器无法从Promise resolve调用中推断类型

前端片段整理

在 Promise 中包装 Auth0 的 parseHash 函数

在javascript承诺中执行的顺序是什么