doina

一个小菜鸟运维工程师.

ES6 Promise异步,链式编程

  • Promise是异步编程的一种解决方案。
  • 可以有效的避免回调地狱的问题

语法

  • new Promise是创建一个Promise对象
  • 小括号中((resolve, reject) => {})也很明显就是一个函数,而且我们这里用的是之前刚刚学习过的箭头函数。
    • 创建Promise时,传入的这个箭头函数是固定的
    • resolve和reject它们两个也是函数,通常情况下,我们会根据请求数据的成功和失败来决定调用哪一个。
    • 如果是成功的,那么通常我们会调用resolve(messsage),这个时候,我们后续的then会被回调。
    • 如果是失败的,那么通常我们会调用reject(error),这个时候,我们后续的catch会被回调。

使用语法 1:

  new Promise((resolve, reject) => {
    setTimeout(() => {
      // 成功的时候调用resolve
      // resolve('Hello World')
      // 失败的时候调用reject
      reject('error message')
    }, 1000)
  }).then((data) => {
    console.log(data);
  }).catch((err) => {
    console.log(err);
  })

使用语法 2:

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

Promise.all

等所有条件都执行完了才开始执行then中的代码

  Promise.all([
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve({name: 'why', age: 18})
      }, 2000)
    }),
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve({name: 'kobe', age: 19})
      }, 1000)
    })
  ]).then(results => {
    console.log(results);
  })

完整实例

完整语法

  new Promise((resolve, reject) => {
    setTimeout(() => {
      // 成功的时候调用resolve
      resolve('++++++ 我是第一个setTimeout函数呀')
      // 失败的时候调用reject
      reject('++++++ 我第一次失败啦~')
    },1000)
  }).then((data) => {
    console.log(data);

    return new Promise((resolve, reject) => {
      setTimeout(() => {
        // resolve('++++++ 我是第二个setTimeout函数呀')
        reject('++++++ 我第二次失败啦~')
      }, 1000)
    }).then(data => {
      console.log(data);

      return new Promise(((resolve, reject) => {
        setTimeout(() => {
          resolve('++++++ 我是第三个setTimeout函数呀')
          reject('++++++ 我第三次失败啦')
        })
      })).then(data => {
        console.log(data);
      }).catch(err => {
        console.log(err);
      })
    }).catch(err => {
      console.log(err);
    })
  }).catch(err => {
    console.log(error);
  })

简写语法

  new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('****** 我是第一个setTimeout函数呀')
      reject('****** 我第一次失败啦~')
    }, 1000)
  }).then(res => {
    console.log(res);

    // 直接简写成Promise.resolve || 后面是失败的参数
    return Promise.resolve('****** 我是第二个setTimeout函数呀') || Promise.reject('****** 我第二次失败啦')
  }).then(res => {
    console.log(res);

    // 忽略掉Promise.resolve, 直接return || 后面是失败的参数
    return !'****** 我是第三个setTimeout函数呀' || '****** 我第三次失败啦'
  }).then(res => {
    console.log(res);
  }).catch(err => {
    console.log(err);
  })
点赞

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据