返回顶部
首页 > 资讯 > 前端开发 > JavaScript >浅析Promise的介绍及基本用法
  • 745
分享到

浅析Promise的介绍及基本用法

2024-04-02 19:04:59 745人浏览 独家记忆
摘要

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

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

  • Promise 构造函数: Promise (excutor) {}
  • Promise.prototype.then 方法
  • Promise.prototype.catch 方法

Promise的基本使用

实例化Promise


new Promise()

在实例化的时候接受一个参数, 这个参数是一个函数。

这个函数有两个形参,resolve 和 reject


var promise = new Promise((resolve,reject) => {
    // 里面用于处理异步操作
})

我们在这里使用定时器来模拟异步操作

promise有三种状态,分别是:进行中、成功、失败。


var promise = new Promise((resolve,reject) => {
    // 这是一个异步操作
    setTimeout(() => {
        // 这里模拟获取数据
        var data = '获取的数据'
        // 在得到数据之后我们可以调用resolve和reject方法来改变promise对象的状态
        resolve(data)  // resolve可以将promise对象的状态改为成功,reject()可以promise将对象状态改为失败
    }, 1000);
})

promise的then方法

当promise对象的状态为成功或者失败时可以调用then方法

then方法接受两个参数,而且两个参数都是函数类型的值

promise对象的状态为成功时,会调用then方法的第一个参数

也是就说promise对象的状态为失败时,会调用then方法的第二个参数

第二个参数时可选的,如果不需要捕获失败可以省略

参数分别有一个形参,成功的函数叫value, 失败的err


promise.then(value => {
// 当异步函数里面调用了resolve(data),也是就说promise对象的状态为成功时,会调用then方法的第一个参数
console.log(value);  // 'hello world' value就是resolve()方法传递过来的数据
}, err => {
   // 当异步函数里面调用了reject(data),也是就说promise对象的状态为失败时,会调用then方法的第二个参数
    console.log(err);  // err就是reject()方法传递过来的数据 
})

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

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


let data = promise.then((val) => {
    // console.log(val.result);
    // 返回非Promise的情况
    // return val.result
 
    // 返回Promise的情况
    return new Promise( (resolve, reject) => {
        // resolve('ok')
        reject('err')
    })
}, err => {
console.log(err);
})
// 返回非Promise的情况 状态为成功,返回值为对象的成功的值 
// 返回结果是Promise 对象,对象状态由回调函数的执行结果决定
// 抛出错误,状态为失败
console.log(data);  

所以then可以链式调用使用方法可参见下面promise应用示例。

promise的catch方法

promise的catch方法是then(null, rejection)的别名,用于指定发生错误时的回调

Promise对象的状态为resolve,就会调用then方法的指定回调函数


const promise = new Promise((resolve, reject) => {
    resolve('ok')
})
promise.then(val => {
    console.log(val);  // ok
}).catch(err => {
    console.log(err);
})

如果promise的状态为rejected就会调用catch方法的回调函数来处理这个问题。


const promise = new Promise((resolve, reject) => {
    reject('err')
})
promise.then(val => {
    console.log(val);
}).catch(err => {
    console.log(err);  // err
})

如果then方法在运行中出现错误也会被catch方法捕获


const promise = new Promise((resolve, reject) => {
    resolve('err')
})
promise.then(val => {
    console.log('ok');    // ok
    throw '出错了!!'     // then里面抛出的错误会继续被catch捕获
}).catch(err => {
    console.log(err);  // 出错了!!
})

promise对象的错误具有冒泡的性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch捕获。


const promise = new Promise((resolve, reject) => {
    resolve('ok')
})
promise.then(val => {
    return new Promise((resolve, reject) => {
        reject('err')
    })
})
.then(val => {
    return new Promise((resolve, reject) => {
        reject('err')
    })
})
.catch(err => {
    // 以上产生的错误都可以被catch捕获到
    console.log(err);  // err
})

一般来说,不要在then方法中定义rejected状态回调函数(即then的第二个参数),而应总是使用catch方法。

promise应用 

promise读取文件,多个文件连续调用

在这个例子中我们用到了node.js的文件模块


// 读取文件信息
const fs = require('fs')

在下面代码中我们使用了promise包装了异步函数

我们先来看看正常的文件读取操作


// 读取文件信息
const fs = require('fs')
 
// 如果读取失败err就是一个错误对象,读取成功data就是数据
fs.readFile('./01.txt', (err, data) => {
    // 判断是否出现错误,如果读取错误就打印错误对象。
    if (err) {
        console.log(err);
        return
    }
    console.log(data.toString());
})

我们如果想在读取成功之后继续读取文件,就需要在回调函数中继续使用fs.readFile...去读取文件,嵌套层次一多,这样一来就会形成回调地狱。 

接下来我们使用Promise的方式来读取文件


// 读取文件信息
const fs = require('fs')
 
const promise = new Promise((resolve, reject) => {
    fs.readFile('./01.txt', (err, data) => {
        if (err) return reject(err)
        resolve(data)
    })
})
 
promise.then(val => {
    console.log(val.toString());
    // 返回一个Promise对象
    return new Promise((resolve, reject) => {
        fs.readFile('./02.txt', (err, data) => {
            if (err) return reject(err)
            resolve(data)
        })
    })
}, err => {
    console.log(err);
})
// 上一个then里面返回的是一个promise对象,我们可以继续.then
.then(val => {
    console.log(val.toString());
    return new Promise((resolve, reject) => {
        fs.readFile('./03.txt', (err, data) => {
            if (err) return reject(err)
            resolve(data)
        })
    })
}, err => {
    console.log(err);
})
.then(val => {
    console.log(val.toString());
}, err => {
    console.log(err);
})

promise封装ajax请求

封装了ajax请求,使用then获取结果,让代码看起来更加简洁,解决了回调地狱的问题


const promise = new Promise((resolve, reject) => {
    // 创建对象
    const xhr = new XMLHttpRequest()
    // 初始化
    xhr.open("GET", 'https://api.apiopen.top/getSongPoetry?page=1&count=20')
    // 发送
    xhr.send()
    // 绑定事件处理响应结果
    xhr.onreadystatechange = function () {
        // 判断
        // 进入最后一个阶段,所有的响应体都回来了
        if (xhr.readyState === 4) {
            // 判断响应码
            if (xhr.status >= 200 && xhr.status < 300) {
                // 表示成功
                // console.log(JSON.parse(xhr.response));
                resolve(jsON.parse(xhr.response))
            } else {
                reject(xhr.status)
            }
        }
    }
})
// 指定回调
promise.then((val) => {
    console.log(val);
}, err => {
    console.log(err);
})

到此这篇关于浅析Promise的介绍及基本用法的文章就介绍到这了,更多相关Promise使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅析Promise的介绍及基本用法

本文链接: https://lsjlt.com/news/154998.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅析Promise的介绍及基本用法
    Promise是ES6引入的异步编程的新解决方案。语法止Promise是-一个构造函数, 用来封装异步操作并可以获取其成功或失败的结果。 Promise 构造函数: Pro...
    99+
    2024-04-02
  • Promise的原理和基础用法介绍
    这篇文章主要介绍“Promise的原理和基础用法介绍”,在日常操作中,相信很多人在Promise的原理和基础用法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Promis...
    99+
    2024-04-02
  • js中promise的用法介绍
    这篇文章主要介绍“js中promise的用法介绍”,在日常操作中,相信很多人在js中promise的用法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js中promise...
    99+
    2024-04-02
  • RocketMQ 介绍及基本概念
    1 介绍 RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。 1.1 RocketMQ 特点 支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型 在一个...
    99+
    2023-08-19
    rabbitmq kafka java
  • JavaScriptwebpack5配置及使用基本介绍
    目录一、webpack1.1 简介1.2 五大核心概念entry (入口)output (出口)loaderplugin (插件)mode (模式)二、配置及使用项目结构使用html...
    99+
    2024-04-02
  • Csh的基本语法介绍
    在*unix系统中,常用的shell有sh,bash,csh/tcsh, ksh. sh来自于systemV的Unix,是传统的Unix的shell,直到现在很多的系统管理员仍然喜欢使用sh。 bash来自...
    99+
    2022-06-04
    语法 Csh
  • Dockerfile的基本语法介绍
    这篇文章主要讲解了“Dockerfile的基本语法介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Dockerfile的基本语法介绍”吧!Dockerfile的组成Dockerfile分为...
    99+
    2023-06-04
  • 详细介绍HTML的基本用法
    HTML是一种基本的网页设计语言,是创建网页的重要工具之一。对于想要学习HTML的初学者来说,了解HTML的基本用法是至关重要的。本文将详细介绍HTML的基本用法,让你轻松入手。一、HTML的基本概念HTML,全称是HyperText Ma...
    99+
    2023-05-14
  • Go语言函数的基本概念及用法介绍
    Go语言是一种快速、简洁、安全并且高效的编程语言,近年来在软件开发领域有着日益增长的影响力。在Go语言中,函数是非常重要的概念,它是程序中最基本的组成单元。本文将介绍Go语言函数的基本...
    99+
    2024-03-09
    函数 用法 概念 go语言
  • SpringMVC+Shiro的基本使用及功能介绍
    目录一.介绍二.基本功能三.使用Maven包四.用户登录五.Reaml六.登录失败次数限制七.退出登录八.创建Ecache缓存以及时效一.介绍 Apache Shiro是Java的一...
    99+
    2024-04-02
  • PHP基本语法介绍
    这篇文章主要介绍“PHP基本语法介绍”,在日常操作中,相信很多人在PHP基本语法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP基本语法介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!在进行PH...
    99+
    2023-06-17
  • HTML5 canvas的基本语法介绍
    本篇内容主要讲解“HTML5 canvas的基本语法介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“HTML5 canvas的基本语法介绍”吧!canvas ...
    99+
    2024-04-02
  • Promise的基本用法是什么
    本篇内容主要讲解“Promise的基本用法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Promise的基本用法是什么”吧!基本用法1. 语法new&nb...
    99+
    2024-04-02
  • Sharding-Proxy基本功能用法介绍
    目录Sharding-Proxy的安装server.yaml配置config-sharding.yaml的配置config-master_slave.yaml的配置config-sh...
    99+
    2024-04-02
  • CSS3转换(transform)基本用法介绍
    CSS3转换(transform)是一种用于改变元素的形状、大小、位置和旋转的技术。它可以通过应用一系列的转换函数来实现这些效果。下...
    99+
    2023-09-28
    CSS3
  • ACL介绍及基本命令配置
    ACL(访问控制列表) 一、ACL概念1、ACL介绍即作用2、ACL工作原理及3、ACL类型 二、命令配置1、基本ACL配置2、高级ACL配置 一、ACL概念 1、ACL介绍即作用 ACL:又称访问控制列表,它只是一个匹...
    99+
    2023-08-19
    网络 linux 服务器
  • Linux系统下Supervisor的基本用法介绍
    这篇文章主要介绍“Linux系统下Supervisor的基本用法介绍”,在日常操作中,相信很多人在Linux系统下Supervisor的基本用法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux系统...
    99+
    2023-06-12
  • C#位运算符的基本用法介绍
    位运算符包括:| 按位或 OR,& 按位与 AND,^ 按位异或 XOR,~ 取反 NOT,<< 左移 Left Shift,>> 右移 Right ...
    99+
    2024-04-02
  • JVM的基本介绍以及垃圾回收
    目录JVM java虚拟机JVMjvm主要组成部分及其作用JVM Stack: jvm栈堆:Jvm heap内存空间划分Full GC一、OOM含义:二、监控GC命令总结JVM ja...
    99+
    2024-04-02
  • 浅析node Async异步处理模块用例分析及常用方法介绍
    最近在研究nodejs,令我感受比较深的是……熟悉js代码的地球人都知道,js的加载顺序很重要!很重要!!那么问题来了,在编写node的时候,会在后台去请求很多接口(我们公司是与java后台交接数据的),接...
    99+
    2022-06-04
    模块 常用 方法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作