Promise(二) 关键问题+async+await

news2025/2/2 8:30:08

目录

1.几个关键问题

2. async函数

3. await表达式 

4.async与await实践结合

5.async与await实践结合——发送Ajax请求获取信息


1.几个关键问题

在promise封装之前做准备

    <script>
        let p = new Promise((resolve, reject) => {
            //三种方式promise状态最开始是pending
            //1. resolve 函数
            // resolve('ok'); // pending   => fulfilled/resolved
            //2. reject 函数
            // reject("error");// pending  =>  rejected 
            //3. 抛出错误
            // throw '出问题了';
        });

        console.log(p);
    </script>

 

能否执行多个回调:then指定回调:题目的意思:如果我们指定then方法为一个promise指定多个回调,这些回调是不是都会被执行

答案:当这个promise对象状态在改变之后,对应的回调函数它们都会调用

    <script>
        let p = new Promise((resolve, reject) => {
//调用了resolve说明是成功的,底下的两个回调都会执行,不调的话一直是pending状态,底下两个回调也不会执行
             resolve('OK');
        });

        ///指定回调 - 1
        p.then(value => {
            console.log(value);
        });

        //指定回调 - 2
        p.then(value => {
            alert(value);
        });
    </script>

 改变promise状态可以用resolve,reject,throw;指定回调函数用then或者catch

(2)在执行器中直接调用 resolve()/reject()是同步任务

    <script>
        let p = new Promise((resolve, reject) => {
            //异步居多
            setTimeout(() => {
                resolve('OK');
            }, 1000);
        });

        p.then(value => {
            console.log(value);
        },reason=>{
            
        })
    </script>

    <script>
        let p = new Promise((resolve, reject) => {
            resolve('ok');
        });
        //执行 then 方法,
        //promise.then()返回的新 promise 的结果状态由 then()指定的回调函数执行的结果决定
        let result = p.then(value => {
            // console.log(value);
            //1. 抛出错误
            // throw '出了问题';
            //2. 返回结果是非 Promise 类型的对象,状态是成功的
            // return 521;
            //3. 返回结果是 Promise 对象
            // return new Promise((resolve, reject) => {
    //此 promise 的结果就会成为新 promise 的结果失败或成功success/error,result结果就是此promise结果
            //     // resolve('success');
            //     reject('error');
            // });
        }, reason => {
            console.warn(reason);
        });

        console.log(result);
    </script>

    <script>
        let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
            }, 1000);
        });

        p.then(value => {
            return new Promise((resolve, reject) => {
                resolve("success");
            });
        }).then(value => {
            console.log(value);//success,拿到上面的
        }).then(value => {
            //then的返回结果是promise
            //此promise状态由它指定的回调函数的返回值决定,这个函数返回值没写就是undefined
            //undefined也不是promise类型
            //,所以这个then方法返回的结果就是一个成功的promise,值为undefined
            console.log(value);//undefined
        })
    </script>

    <script>
        let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
                // reject('Err');
            }, 1000);
        });
//只有resolve了底下的then才能调只写了value
        p.then(value => {
            // console.log(111);
            throw '失败啦!';
        }).then(value => {
            console.log(222);
        }).then(value => {
            console.log(333);
        }).catch(reason => {
            //throw '失败啦!';这个错误是由最终的catch方法处理的
            console.warn(reason);
        });
    </script>

    <script>
        let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
            }, 1000);
        });

        p.then(value => {
            console.log(111);
            //有且只有一个方式
            //在回调函数中返回一个 pendding 状态的 promise 对象
            //后续状态就都不能执行了,状态没有改变
            return new Promise(() => {});
        }).then(value => {
            console.log(222);
        }).then(value => {
            console.log(333);
        }).catch(reason => {
            console.warn(reason);
        });
    </script>

2. async函数

    <script>
        //async函数的返回值为 promise 对象
        async function main(){
//1. 如果返回值是一个非Promise类型的数据,只要不是Promise类型的对象,
//那结果就是成功的promise对象,结果值为return的结果
            // return 521;
            //2. 如果返回的是一个Promise对象
            // return new Promise((resolve, reject) => {
            //     // resolve('OK');main函数的返回结果就是一个成功的promise对象
            //     reject('Error');
            // });
            //3. 抛出异常,返回结果是一个失败的promise对象,值是"Oh NO"
            throw "Oh NO";
        }
        //调用main
        let result = main();

        console.log(result);
    </script>

3. await表达式 

其他值指的是数字,字符串,布尔类型等等

主要是对promise成功的结果进行一个获取,如果失败的就用try..catch..获取

注意:

    <script>
        async function main(){
            let p = new Promise((resolve, reject) => {
                // resolve('OK');
                reject('Error');
            })
            //1. 右侧为promise的情况
            // let res = await p;   OK
            //2. 右侧为其他类型的数据
            // let res2 = await 20;    20
            //3. 如果promise是失败的状态
            try{
                let res3 = await p;
            }catch(e){
                //拿到失败的结果
                console.log(e);
            }
        }
        main();
    </script>

4.async与await实践结合

/**
 * resource  1.html  2.html 3.html 文件内容
 * //拼接进行输出
 */

const fs = require('fs');
//util中的方法将API转化成promise形态的函数
const util = require('util');
const mineReadFile = util.promisify(fs.readFile);

//1.回调函数的方式实现
// fs.readFile('./resource/1.html', (err, data1) => {
//     if(err) throw err;有问题就抛出错误,没有问题就拿到1.html
//     fs.readFile('./resource/2.html', (err, data2) => {
//         if(err) throw err;
//         fs.readFile('./resource/3.html', (err, data3) => {
//             if(err) throw err;
//             console.log(data1 + data2 + data3);
//         });
//     });
// });

//2.async 与 await实现
async function main(){
    try{
        //读取第一个文件的内容,await后面放的是promise对象,并且可以获得其成功的结果
        let data1 = await mineReadFile('./resource/1x.html');
        let data2 = await mineReadFile('./resource/2.html');
        let data3 = await mineReadFile('./resource/3.html');
        console.log(data1 + data2 + data3);
    }catch(e){
        console.log(e.code);
        //出错用try-catch包裹
    }
}

main();

5.async与await实践结合——发送Ajax请求获取信息

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>async与await结合发送AJAX</title>
</head>
<body>
    <!-- 点击按钮发送Ajax请求获取信息 -->
    <button id="btn">点击获取段子</button>
    <script>
        //axios
        function sendAJAX(url){
            return new Promise((resolve, reject) => {
                const xhr = new XMLHttpRequest();
                xhr.responseType = 'json';
                xhr.open("GET", url);
                xhr.send();
                //处理结果
                xhr.onreadystatechange = function(){
                    if(xhr.readyState === 4){
                        //判断成功
                        if(xhr.status >= 200 && xhr.status < 300){
                            //成功的结果
                            resolve(xhr.response);
                        }else{
                            reject(xhr.status);
                        }
                    }
                }
            });
        }

        //段子接口地址 https://api.apiopen.top/getJoke
        let btn = document.querySelector('#btn');//获取按钮
//绑定点击事件
        btn.addEventListener('click',async function(){
            //获取段子信息
            let duanzi = await sendAJAX('https://api.apiopen.top/getJoke');
            console.log(duanzi);
        });
    </script>
</body>
</html>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode】1760. 袋子里最少数目的球

袋子里最少数目的球 给你一个整数数组 nums &#xff0c;其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。 你可以进行如下操作至多 maxOperations 次&#xff1a; 选择任意一个袋子&#xff0c;并将袋子里的球分到 2 个新的袋子中&#xff0c;每…

媒体查询。

媒体查询( Media Query )是CSS3新语法 使用media查询&#xff0c;可以针对不同的媒体类型定义不同的样式 media 可以针对不同的屏幕尺寸设置不同的样式 当你重置浏览器大小的过程中&#xff0c;页面也会根据浏览的宽度和高度重新渲染页面 目前针对很多苹果手机、Android手机&am…

【算法】【字符串模块】字符串数组中两个字符之间的最短距离以及对hashcode以及equals的理解

目录前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本思考感悟写在最后前言 当前所有算法都使用测试用例运行过&#xff0c;但是不保证100%的测试用例&#xff0c;如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识&#xff01; 问题介绍 …

来聊一聊|ConcurrentModificationException异常的解决

一. 前言 最近耀哥的一个学生&#xff0c;在使用使用ArrayList的subList的时候&#xff0c;发生了ConcurrentModificationException的异常。耀哥觉得这个现象非常具有代表性&#xff0c;估计有不少同学都会在同样的问题上犯迷糊&#xff0c;所以今天耀哥特意把这个问题记录下来…

设备台账管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 模块划分&#xff1a;公告类型、公告信息、员工信息、仓库信息、设备类型、设备信息、供应商信息、采购信息、设备调拨、…

8个Spring事务失效的场景,你碰到过几种?

前言 作为Java开发工程师&#xff0c;相信大家对Spring种事务的使用并不陌生。但是你可能只是停留在基础的使用层面上&#xff0c;在遇到一些比较特殊的场景&#xff0c;事务可能没有生效&#xff0c;直接在生产上暴露了&#xff0c;这可能就会导致比较严重的生产事故。今天&a…

基于Android7 的msm8953芯片的nfc调试

目录 报错日志 NFC芯片重要的5个引脚 时序图分析 报错日志 01-01 19:05:22.570 0000 2341 2532 D NxpFwDnld: phDnldNfc_InitImgInfo:SUCCESS 01-01 19:05:22.570 0000 2341 2532 D NxpFwDnld: Processing Normal Sequence.. 01-01 19:05:22.570 0000 2341 2532 D NxpFwD…

干货|PCB电路板的组成、设计、工艺、流程及元器摆放和布线原则

大家对PCB电路板电路这个词很熟&#xff0c;有的了解PCB电路板的组成&#xff0c;有的了解PCB电路板的设计步骤&#xff0c;有的了解PCB电路板的制作工艺......但是对整个PCB电路板的组成、设计、工艺、流程及元器摆放和布线原则&#xff0c;及后期的注意事项没有一个综合的了解…

Spring 中 ConfigurationClassPostProcessor 类扫描解析之 @ComponentScan 解析

ConfigurationClassPostProcessor 简单概述 Spring 中类的解析是非常重要的&#xff0c;因为工程中有很多类&#xff0c;并且被一些注解修饰&#xff0c;比如&#xff1a;Component、Bean、Import、PropertySource、ImportSource、Scope 等。 你在类或者方法上标注这些注解&a…

Tensorflow1 搭建Cuda11

前言 Tensorflow1中默认支持cuda10及以下的&#xff0c;最高的版本Tensorflow1.15默认使用cuda10&#xff1b;但是一些高性能的显卡&#xff0c;比如A100、3090等&#xff0c;它们只支持Cuda11的&#xff0c;这就不太友善了&#xff0c;毕竟不少项目依赖Tensorflow1搭建的。 …

linux基础学习-系统信息相关命令以及一些其他命令

主要是为了方便远程终端维护服务器时&#xff0c;查看服务器上当前的 系统日期和时间/磁盘空间占用情况/程序执行命令时间和日期 磁盘信息 -h&#xff1a;以人性化的方式显示文件大小进程信息 进程通俗地说就是当前正在执行的一个程序 ps默认只会显示当前用户通过终端启动的…

使用 openpyxl 在 Excel 电子表格中自动执行日常任务

花费数小时处理 Excel 中平凡的重复性任务。使用 Python 和 openpyxl 探索自动化。 像许多从事各种业务职能的人一样,我几乎每天都使用 Excel 来制作图表和分析。然而,其中一些图表需求相当平凡,涉及使用新的原始数据集创建新的工作表,该数据集需要以某种可预测的形式进行处…

采购管理基础知识:采购方法、模式与数据的作用

采购是任何企业的一个关键部分&#xff0c;是从外部来源获得货物和服务的过程。采购的目标是为企业获得尽可能好的价值。 采购流程可以通过使用各种工具进行优化。最重要的工具是采购管理软件。这种软件可以帮助企业跟踪他们的采购过程&#xff0c;并确保它们是有效的。 采购…

javaweb当中mysql要掌握的知识点(简单基础入门)

目录 1.mysql的数据模型 A.关系型数据库 B.mysql的客户端和数据库间的关系 C.数据库当中不同文件控制表的相关数据 2.使用注释 A.使用井号#加上要注释的文字 3.DDL---操作数据库 A.基本操作 B.创建表 C.修改表 D.给表添加数据 E.基础查询 F.排序查询语法 G.分页查询 4.…

linux下的环境变量

环境变量查看环境变量方法环境变量的组织方式通过代码如何获取环境变量 查看环境变量方法 环境变量的组织方式通过代码如何获取环境变量查看环境变量方法 环境变量的组织方式 通过代码如何获取环境变量 查看环境变量方法 ./常见的环境变量. 1️⃣ PATH:指定命令的搜索路径 2…

有哪些好用的建筑工程项目管理软件?

工程项目管理是建筑企业经营管理的核心业务&#xff0c;任何一家施工企业、任何一个工程管理团队&#xff0c; 无论是建立初创型企业&#xff0c;还是小公司开始进行业务扩张时&#xff0c;工程项目管理都至关重要。 针对行业痛点&#xff0c;推荐试试这款系统&#xff1a;ht…

银河麒麟V10系统NetworkManager服务启动失败的解决方法

目录 一、NetworkManger网络服务启动失败 二、故障定位过程 &#xff08;一&#xff09;重装NetworkManager未解决 &#xff08;二&#xff09;重装openssl未解决 三、解决方案 &#xff08;一&#xff09;修改/etc/ld.so.conf配置文件 &#xff08;二&#xff09;执行ld…

实操干货!专利的12种用处。

对于专利申请人和企业来说&#xff0c;为什么要申请专利以及申请到的专利能有什么作用&#xff1f; 答案可能会有很多种&#xff0c;小编在本文中列举了12种。你的理由是什么呢&#xff1f;可以在文后留言与我们进行互动交流。 几十年来中国专利申请数量已足足有几百万&#x…

C语言 CJSON使用实例

C语言 CJSON使用实例 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录C语言 CJSON使用实例前言一、cJSON实例1. json数据的封装2. json数据解析前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a…

【小5聊】Sql Server时间转换和查询时间范围查询不正确的原因

最近在做时间方法封装的时候发现了一个问题&#xff01; 如果sql语句输出的时间字段转为了字符串输出&#xff0c;那么在使用此字段作为时间范围筛选时发现无效了&#xff0c;没法过滤对应的时间范围内记录 下面进行场景重现下 1、创建表 创建只有三个字段的表testTable&…