ES6 ------ 基础(三)——Promise 基本使用

简介: ES6 ------ 基础(三)——Promise 基本使用

Promise 基本使用

Promise 是 ES6 引入的解决异步编程的新解决方案。语法上 Promise 是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。

  1. 1.Promise 构造函数:Promise(excutor){}
  2. 2.Promise.prototype.then 方法
  3. 3.Promise.prototype.catch 方法
    // 实例化 Promise 对象
        const p = new Promise(function(resolve,reject){
            setTimeout(function(){
                // 成功
                let data = '数据库中的用户数据'
                resolve(data) 
                // 失败
                let err = '数据读取失败'
                reject(err)
            },1000)
        })
        // 调用 promise 对象的 then 方法
        // 两个函数, 成功的形参叫value,失败的形参叫reason
        p.then(function(value){  //成功
            console.log(value); 
        },function(reason){   //失败
            console.log(reason); 
        })

Promise 读取文件

读取方法一:调用方法读取文件

  1. 1.创建 为学.md 文件
  为之,则难者易易也
  不为,则易者亦难矣
  1. 2.创建 Promise读取文件.js 文件
  // 1.引入 fs 模块
  const fs = require('fs')
  // 2.调用方法读取文件
  fs.readFile('为学.md',(err, data)=>{
      // 如果失败,则抛出错误
      if(err) throw err
      // 如果没有,则输出内容
      console.log(data.toString());
  })
  1. 3.终端输入命令 node Promise读取文件.js 回车。
  2. 7744712b8f784de29d3fead318eb077a.png
  3. 读取方法二:使用 Promise 封装
  4. 1.创建 为学.md 文件
  为之,则难者易易也
  不为,则易者亦难矣
  1. 2.创建 Promise读取文件.js 文件
  const p = new Promise(function(resolve,reject){
      fs.readFile('为学.md',(err, data)=>{
          // 判断如果失败
          if(err) reject(err)
          // 如果成功
          resolve(data)
      })
  })
  p.then(function(value){
      console.log(value.toString())
  },function(reason){
      console.log("读取失败!!");
  })

3.终端输入命令 node Promise读取文件.js 回车。

读取成功

aa6473823ccf4ff495962c69fed857f6.png

读取失败(如 '为学.md' 的路径错误)

679794db45a7416797e66a25ac955a9a.png

Promise 封装 AJAX

接口地址:https://api.apiopen.top/getJoke

  const p = new Promise((resolve, reject)=>{
        // 1.创建对象
        const xhr = new XMLHttpRequest()
        // 2.初始化
        xhr.open("GET","https://api.apiopen.top/getJoke")
        // 3.发送
        xhr.send()
        // 4.绑定事件, 处理响应结果
        xhr.onreadystatechange = function(){
            // 判断
            if(xhr.readyState === 4){
                // 判断响应状态码 200-299
                if(xhr.status >= 200 && xhr.status < 300){
                    // 表示成功
                    resolve(xhr.response)
                }else{
                    reject(xhr.status);
                }
            }
        }
    })
    // 指定回调
    p.then(function(value){
        console.log(value);
    },function(reason){
        console.log(reason);
    })

成功输出

705c39ad463e49d390ab99a7f101efa7.png

输出失败:404


Promise.prototype.then 方法

调用 then 方法 ,then 方法 的返回结果是 Promise 对象,对象的状态由回调函数的结果决定。

如果回调函数中返回的结果是 非 Promise 类型 的属性,状态为成功 返回值为对象的成功值


1.非 promise 类型的属性

  // 创建 promise 对象
    const p = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('用户数据')
            // reject('出错啦')
        },1000)
    })
    const result = p.then(value => {
        console.log(value)
        // 1.非 promise 类型的属性
        return 123
    }, reason => {
        console.warn(reason) //console.warn() 在控制台上输出警告信息
    })
    console.log(result);

5ded13379c9443618a7157d187dbb04b.png

  1. 2.是 promise 对象
  // 创建 promise 对象
    const p = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('用户数据')
            // reject('出错啦')
        },1000)
    })
    const result = p.then(value => {
        console.log(value)
        // 2.是 promise 对象
        return new Promise((resolve, reject)=>{
            // resolve('ok')
            reject('error')
        })
    }, reason => {
        console.warn(reason) //console.warn() 在控制台上输出警告信息
    })
    console.log(result);

resolve('ok')的情况下:

b80f428abc1944b8b7be99c1b9317cc1.png

reject('error')的情况下:

5ecbf5c5dea8450db0af488f29bacd4c.png

  1. 3.抛出错误
  // 创建 promise 对象
    const p = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('用户数据')
            // reject('出错啦')
        },1000)
    })
    const result = p.then(value => {
        console.log(value)
        // 3.抛出错误
        throw '出错啦'
    }, reason => {
        console.warn(reason) //console.warn() 在控制台上输出警告信息
    })
    console.log(result);

e6ee88760b4c41a8b4cd62354a6a51f0.png

Promise 实践

读取三个 .md 文件,三个文件合在一起输出

  1. 1.回调的方式 (回调地狱)
  // 引入 fs 模块
  const fs = require("fs")
  const { resolve } = require("path/posix")
  //1.回调的方式
  fs.readFile('为学.md',(err, data1)=>{
      fs.readFile('插秧诗.md',(err,data2)=>{
          fs.readFile('观书有感.md',(err,data3)=>{
              let result = data1 + '\r\n' + data2 + '\r\n' + data3
              console.log(result);
          })
      })
  }) 

556614afb315421a87ca6149856ad9fb.png

2.通过 promise 实现

  const fs = require("fs")
  const { resolve } = require("path/posix")
  // 2.使用 promise 实现
  const p = new Promise((resolve, reject)=>{
      fs.readFile('为学.md',(err,data)=>{
          resolve(data)
      })
  })
  p.then(value=>{
      return new Promise((resolve, reject)=>{
          fs.readFile('插秧诗.md',(err,data)=>{
              resolve([value, data])
          })
      })
  }).then(value => {
      return new Promise((resolve, reject)=>{
          fs.readFile('观书有感.md',(err,data)=>{
              //压入
              value.push(data)
              resolve(value)
          })
      })
  }).then(value=>{
      console.log(value.join('\r\n')); // \r\n 表示换行
  })

d478c0f1ebc041ad8104fca1715fc5c2.png

Promise-catch 方法

用来指定 promise 对象失败的回调。

  1. 1.使用 then 方法
  const p = new Promise((resolve, reject)=>{
        setTimeout(()=>{
            // 设置 p 对象的状态为失败, 并设置失败的值
            reject("出错啦")
        },1000)
    })
    p.then(function(value){},function(reason){
            console.error(reason);
    })

141e23b9f09745458a62abb7953a17ee.png

2. 使用 catch

  const p = new Promise((resolve, reject)=>{
        setTimeout(()=>{
            // 设置 p 对象的状态为失败, 并设置失败的值
            reject("出错啦")
        },1000)
    })
    p.catch(function(reason){
        console.warn(reason);
    })

881f01bcb87c406a8d7ca532b2233ff5.png

阮一峰 ES6-Promise:https://es6.ruanyifeng.com/#docs/promise

不积跬步无以至千里 不积小流无以成江海

相关文章
|
8天前
|
前端开发
理解 ES6 中的 Promise
【10月更文挑战第24天】ES6 中的 Promise 是一种用于处理异步操作的机制,它提供了一种更优雅、更可控的方式来处理异步任务的结果。Promise 可以看作是对异步操作结果的一种承诺,它可以处于三种不同的状态:Pending(等待中)、Fulfilled(已完成,即成功)和 Rejected(已拒绝,即失败)。
|
28天前
|
前端开发 JavaScript 小程序
JavaScript的ES6中Promise的使用以及个人理解
JavaScript的ES6中Promise的使用以及个人理解
15 1
|
28天前
|
前端开发 Java
说说你对es6中promise的理解?
说说你对es6中promise的理解?
12 1
|
29天前
|
前端开发 Java
说说你对es6中promise的理解?
说说你对es6中promise的理解?
|
2月前
|
前端开发 JavaScript
ES6新标准下JS异步编程Promise解读
ES6新标准下JS异步编程Promise解读
36 3
|
28天前
|
存储 前端开发 JavaScript
关于 ES6 中 Promise 的面试题
关于 ES6 中 Promise 的面试题
16 0
|
3月前
|
前端开发
手写实现ES6的Promise.all()和Promise.race()函数
这篇文章介绍了如何手写实现ES6的`Promise.all()`和`Promise.race()`函数,提供了实现这两个Promise聚合函数的详细代码示例,并展示了如何使用它们。
手写实现ES6的Promise.all()和Promise.race()函数
|
6月前
|
前端开发 JavaScript
如何处理 JavaScript 中的异步操作和 Promise?
如何处理 JavaScript 中的异步操作和 Promise?
64 1
|
6月前
|
前端开发 JavaScript
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
94 4
|
6月前
|
前端开发 JavaScript 开发者
JavaScript 中的异步编程:Promise 和 Async/Await
在现代的 JavaScript 开发中,异步编程是至关重要的。本文将介绍 JavaScript 中的异步编程概念,重点讨论 Promise 和 Async/Await 这两种常见的处理异步操作的方法。通过本文的阐述,读者将能够更好地理解和应用这些技术,提高自己在 JavaScript 开发中处理异步任务的能力。