Promise 一: 基本问题

关于setTimeout的知识点以及setTimeout(0)的使用场景 试试以下例子: <!DOCTYPE html> <html> <head> <title>demo</title> </head> <body> <input type="text" onkeydown="show()"> <script type="text/javascript"... 阅读详情

目录

1. Promise 是什么

理解

1. 抽象表达:

2. promise 的状态改变

3.promise 的基本流程

 4. promise 的基本使用

 2. 为什么要用 Promise?

 2.1. 指定回调函数的方式更加灵活

2.2. 支持链式调用, 可以解决回调地狱问题

3. 如何使用 Promise?

3.1. API

1. Promise 是什么

理解

1. 抽象表达:

    1) Promise 是一门新的技术 (ES6 规范 )
    2) Promise 是 JS 中进行异步编程的新解决方案
    备注:旧方案是单纯使用回调函数
2. 具体表达 :
   1) 从语法上来说 : Promise 是一个构造函数
   2) 从功能上来说 : promise 对象用来封装一个异步操作并可以获取其成功 / 失败的结果值

2. promise 的状态改变

1. pending 变为 resolved
2. pending 变为 rejected
说明 : 只有这 2 种 , 且一个 promise 对象只能改变一次
无论变为成功还是失败 , 都会有一个结果数据
成功的结果数据一般称为 value, 失败的结果数据一般称为 reason

3.promise 的基本流程

 4. promise 的基本使用

使用 1: 基本编码流程

 

使用 2: 使用 promise 封装基于定时器的异步

 

使用 3: 使用 promise 封装 ajax 异步请求

 

 2. 为什么要用 Promise?

 2.1. 指定回调函数的方式更加灵活

1. 旧的 : 必须在启动异步任务前通过回调函数指定
Promise之前的旧方案都是使用回调函数完成异步编程的操作
1、fs 文件操作 如 NodeJS 

require('fs').requireFile('./index.html',(error,data)=>{})

2、数据库操作 如 MongoDB MySQL

3、 AJAX 网络请求

$.get('/server',(data)=>{})

4、定时器 setTimeout(()=>{},2000)

2. promise: 启动异步任务 => 返回promie对象 => 给promise对象绑定回调函

数 ( 甚至可以在异步任务结束后指定 / 多个 )

2.2. 支持链式调用, 可以解决回调地狱问题

1. 什么是回调地狱 ?
回调函数嵌套调用 , 外部回调函数异步执行的结果是嵌套的回调执行的条件
比如我要说一句话,语序必须是下面这样的:武林要以和为贵,要讲武德,不要搞窝里斗。如果他们都是异步任务的话,必须进行以下操作,才能保证顺序正确:
    setTimeout(function () {  //第一层
        console.log('武林要以和为贵');
        setTimeout(function () {  //第二程
            console.log('要讲武德');
            setTimeout(function () {   //第三层
                console.log('不要搞窝里斗');
            }, 1000)
        }, 2000)
    }, 3000)

使用promise就可以解决这个问题

   function fn(str){
            var p=new Promise(function(resolve,reject){
                //处理异步任务
                var flag=true;
                setTimeout(function(){
                    if(flag){
                        resolve(str)
                    }
                    else{
                        reject('操作失败')
                    }
                })
            })
            return p;
        }

     fn('武林要以和为贵')
    .then((data)=>{
        console.log(data);
        return fn('要讲武德');
    })
    .then((data)=>{
        console.log(data);
        return fn('不要搞窝里斗')
    })
    .then((data)=>{
        console.log(data);
    })
    .catch((data)=>{
        console.log(data);
    })

2. 回调地狱的缺点?

不便于阅读
不便于异常处理
3. 解决方案 ?
promise 链式调用
4. 终极解决方案 ? 
async/await

3. 如何使用 Promise?

3.1. API

Promise 构造函数 : Promise (excutor) {}
(1) executor 函数 : 执行器 (resolve, reject) => {}
(2) resolve 函数 : 内部定义成功时我们调用的函数 value => {}
(3) reject 函数 : 内部定义失败时我们调用的函数 reason => {}
说明 : executor 会在 Promise 内部立即同步调用 , 异步操作在执行器中执行
Promise.prototype.then 方法 : (onResolved, onRejected) => {}
(1) onResolved 函数 : 成功的回调函数 (value) => {}
(2) onRejected 函数 : 失败的回调函数 (reason) => {}
说明 : 指定用于得到成功 value 的成功回调和用于得到失败 reason 的失败回调
返回一个新的 promise 对象
Promise.prototype.catch 方法 : (onRejected) => {}
(1) onRejected 函数 : 失败的回调函数 (reason) => {}
说明 : then() 的语法糖 , 相当于 : then(undefined, onRejected)
Promise.resolve 方法 : (value) => {}
(1) value: 成功的数据或 promise 对象
说明 : 返回一个成功 / 失败的 promise 对象
Promise.reject 方法 : (reason) => {}
(1) reason: 失败的原因
说明 : 返回一个失败的 promise 对象
// 1.创建一个新的promise对象
const p = new Promise((resolve, reject) => {
  // 执行器函数 同步回调
  // 2.执行异步操作任务
  setTimeout(() => {
    const time = Date.now();
    // 如果当前时间是偶数代表成功,否则代表失败
    // 3.1 如果成功了,调用resolve(value)
    if (time % 2 == 0) {
      resolve("成功的数据, time=" + time);
    } else {
      // 3.2 如果失败了,调用reject(reason)
      reject("失败的数据, time=" + time);
    }
  });
}, 1000);

//如果传入的参数为 非Promise类型的对象, 则返回的结果为成功promise对象
//如果传入的参数为 Promise 对象, 则参数的结果决定了 resolve 的结果

p.then(
  (value) => {
    // 接收得到成功的value数据
    console.log("onResolved", value);
  },
  (reason) => {
    // 接收得到失败的reason数据
    console.log("onRejected", reason);
  }
);
 Promise.all 方法 : (promises) => {}
(1) promises: 包含 n 个 promise 的数组
说明 : 返回一个新的 promise, 只有所有的 promise 都成功才成功 , 只要有一个失败了就
直接失败
 
        let p1 = new Promise((resolve, reject) => {
            resolve('OK');
        })
        // let p2 = Promise.resolve('Success');
        let p2 = Promise.reject('Error');
        let p3 = Promise.resolve('Oh Yeah');
        
        //
        const result = Promise.all([p1, p2, p3]);

        console.log(result); // Uncaught (in promise) Error
 

Promise.race 方法: (promises) => {}

(1) promises: 包含 n 个 promise 的数组
 race就是赛跑的意思,意思就是说, Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果(只有一个), 不管结果本身是成功状态还是失败状态。
说明 : 返回一个新的 promise, 第一个完成的 promise 的结果状态就是最终的结果状态
let p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('success')
  },1000)
})

let p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('failed')
  }, 500)
})

Promise.race([p1, p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)  // 打开的是 'failed'
})
聊一聊关于Promise的基础问题以及Promise的进阶问题 (aysnc、await、finally、for await of ) 想要让你的promise变得更加的优雅,想要更加深入的去了解ES6到ES8对promise一共进行了多少改进吗,看这篇文章就对了 阅读详情

相关推荐

Promise 异步用法

Promise 用法

daicooper的博客 1083

定时器:setTimeout()

setTimeout(function(){ console.log("执行了") },1000) 这段代码我们一般说:1秒后会执行setTimeout里面的函数,但是正确的解释应该是:1秒后setTimeout里面的函数会被推入event queue(事件队列),而事件队列里面的任务,只有在主线程空闲时才会执行。所以只有满足2个条件:一.1秒后 。 二.主线程空闲。才会执行setTimeout里面的回调函数。 需要注意的是,setTimeout()只是将事件插入了"事件队列",如果主线程执行.

Eden_Yin的博客 1788

Promise 解决 jquery ajax 验证回调嵌套的问题

作为前端,需要经常验证用户输入和表单提交,一般像验证姓名,手机号,邮箱,身份证号等都在前端用正则匹配来验证就够了,传到后台以后后台可以再验证一次,但是最近项目要求统一调用后台接口进行验证。那么问题来了,如果只是在前端正则验证,那只需要判断每个输入的验证均为true,然后提交表单即可,如下: if( validateMob() &amp;&amp; validateId &amp;&amp; v...

Tinybic 966

setTimeout理解

如果在设定的时间内,发生新的keydown事件,则不触发Ajax通信,并且重新开始计时。所以上面的代码执行流程是:JS执行到setTimeout时,将其交给浏览器去计时(哪怕时间是0),然后去执行同步的for循环,因为例子中的for循环执行需要5s左右,在for循环执行3秒时,浏览器已经把之前的计时器计时完毕,然后推送到JS的事件队列里,当做下一个task任务执行,当前任务(for循环)不受影响,当for循环结束后,JS线程空了,然后去事件队列中取微任务或者新的任务(setTimeout),然后执行。

weixin_41989250的博客 6443

Solidworks转URDF避坑实录:从履带机器人到ROS仿真的完整配置流程

本文详细介绍了将Solidworks履带机器人模型转换为URDF格式并配置ROS仿真的完整流程,重点解析了坐标系设置、复杂关节定义、插件配置等关键步骤中的常见问题与解决方案,帮助开发者高效实现履带机器人在RVIZ和Gazebo中的精确仿真。

weixin_30693683的博客 457

【UOJ170】Picks loves segment tree VIII

【题目链接】 点击打开链接 【前置阅读】 【BZOJ4695】最假女选手 【BZOJ3064】【TYVJ1518】CPU监控【UOJ169】【UR #11】元旦老人与数列 【思路要点】 前置阅读中的前两题中,我们分别对线段树的区间取最大/最小值和线段树的历史最大/最小值进行了研究。本题中,两类问题同时出现,因此我们

cz_xuyixuan的博客 1253

setTimeout 用法

总的来说用法就一种: setTimeout(要执行的代码,间隔时间,参数1,参数2); 但是要执行的代码有几种写法,分别如下: 如果执行的代码不需要参数,有3种写法如下: 1,直接将js代码写在字符串中: setTimeout("alert(123)",500); 2,在字符串中调用函数: setTimeout("callFun()",500); function callFun(){ alert(456); } 3,使用匿名函数: setTimeout(()=

weixin_43833851的博客 1万+

计算机网络Wireshark实验(西安交通大学)

实验名称 计算机网络Wireshark实验 实验日期 2021 年 5 月 17 日 实验地点 XJTU

沉鱼叶的博客 1817

【JS】Promise中包含setTimeout/setInterval时的resolve触发

前提: 1.假设函数f1和f2异步执行,f1和f2在promise中被调用 2.f1执行所需的时间不确定,且f1中有可能会有其他异步操作 问题: 无法确定f1所处的Promise对象中,resolve返回的正确位置 解决方案: 基本的f1和f2代码段如下: var f1=function(){ setTimeout(function(){ console.log('t...

爆爆爆炸beng 3880

避坑指南:ShardingSphere连接达梦/金仓数据库时SQL解析器的那些‘坑‘

本文深入探讨了ShardingSphere与国产数据库(如达梦、金仓)集成时遇到的SQL解析器差异问题,提供了详细的解决方案和优化策略。通过分析SQL方言差异、JDBC实现差异及解析器兼容性,帮助开发者有效避坑,提升分布式数据库架构设计的效率与稳定性。

weixin_29309475的博客 392

Open3D (C++) 使用点云创建数字高程模型DEM

Open3D (C++) 使用点云创建数字高程模型DEM

点云侠的博客 1392

关于promise的一些问题和理解(一)

最近,对于找工作是忙的焦头烂额,再加上觉得自己有许多不足,只能一一补齐,心力交瘁 对于promise,我从18年就听过,也曾片段学习过,奈何总是抓不到重点,你要是和我讲callback,我倒是能理解 简单来说,就是传名,传引用。 复杂点说,就是我定义了操作的内容和行为,交给你,你要按照我的要求把东西带齐了,再来告诉我 如果code来说呢,简单表示如下 function b(executor) { executor('content1', 'content2'); } functio

FuChenRenShen的博客 452

生成模型实战 | ProGAN详解与实现

Progressive GAN (ProGAN) 是一种通过渐进式增长网络结构来生成高分辨率、高保真图像的技术。传统 GAN 难以直接生成超过 256x256 分辨率的图像,而 ProGAN 创新性地从低分辨率开始训练生成器和判别器,逐步添加网络层以提高分辨率,直至达到1024x1024。该方法结合了像素归一化、小批次统计信息和均衡化学习率等关键技术,并使用 WGAN-GP 损失函数确保训练稳定性。ProGAN 是首个能生成1024x1024高保真人脸图像的模型,但其训练耗时较长,且对计算资源要求较高。

盼小辉丶的博客 1435

JS异步之Promise解决信任问题(一)

文章目录promise对于不信任问题的解决。1调用过早、调用过晚2回调未调用3调用次数过多4未能传递参数/环境值5吞掉错误或者异常promise也没有摆脱回调 promise对于不信任问题的解决。 1调用过早、调用过晚 以为promise的then是异步的,所以不论你调用早或者晚,状态改变的早或者晚,都要等这一轮宏任务完成后才能去执行微任务,去执行then。 2回调未调用 1、首先,没有任何东西(包括错误)能阻止promise决议,如果你对promise注册了一个完成回调和一个拒绝回调,那么promise总

qq_44222205的博客 714

【OpenClaw】Edict 三省六部制部署与启动

文章摘要 本文聚焦Edict系统的本地部署与启动,提供三种安装方式:Docker快速体验、macOS/Linux原生安装和Windows生产仿真。核心目标是让用户能够独立完成系统启动和基础问题排查,确保看板、后端服务、同步脚本和网关正常运行。文章强调环境检查的重要性,并给出具体验收标准:浏览器能访问看板页面(http://127.0.0.1:7891)和接口返回JSON数据。同时提供一键启动/停止脚本和常见问题处理建议,帮助用户快速验证部署结果。配套系列教程涵盖部署启动、使用实战、二次开发和封装版本使用等内

Mr数据杨 2903

无刷电机里的霍尔传感器,和 AS5600 编码器到底有什么区别?

摘要: 无刷电机中的霍尔传感器主要用于换相控制,提供6种状态反馈,无法实现精确角度测量。与AS5600磁编码器(分辨率4096)相比,霍尔仅能确保电机“转得对”,而编码器则用于高精度角度反馈。在机器人等需要位置闭环的场景中,两者需协同使用:霍尔负责基础换相,编码器提供精确角度控制。简单应用中可仅用霍尔,但高精度定位必须搭配编码器。

qq_45430571的博客 242

学习ES6新增对象Promise时的问题与理解(一)

  笔者最近在学习ES6新增对象Promise时遇到了一些问题,在此对我遇到的一些问题做一些整理与总结。本文主要针对本人认为的难点进行叙述总结,一些基础的内容在此不再赘述。   本文主要参考了MDN参考文档和《JavaScript高级程序设计(第四版)》以及阮一峰大佬的《ES6标准入门》

Legolas_PRC的博客 440

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【ECMAScript 5_6_7】9、ES6——Promise对象(异步回调问题解决方案一)

一、理解: * Promise对象: 代表了未来某个将要发生的事件(通常是一个异步操作) * 有了promise对象, 可以将异步操作以同步的流程表达出来, 避免了层层嵌套的回调函数(俗称'回调地狱') * ES6的Promise是一个构造函数, 用来生成promise实例 二、使用promise基本步骤(2步):   1、创建promise对象 let promise = new...

edc3001的博客 491

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【转】for循环中进行Promise异步操作的问题总结

转:https://blog.youkuaiyun.com/canot/article/details/73505891 笔者在for循环中进行Promise异步操作的时候,主要会遇到两个问题: 一是如何让所有的for循环中的Promise操作结束后执行某个操作 二是循环中如果后一个Promise的执行依赖与前一个Promise的执行结果(例如对于某个数据库操作) 问题1,如何让for循环中的Promis...

mao_mao37的博客 1865

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Promise的基本使用

qq_34407448的博客 121

JS-Promise

Promise是JavaScript中用于异步编程的解决方案,通过构造函数创建,接收resolve和reject两个回调函数,分别处理成功和失败的情况。Promise的状态只能从pending变为resolved或rejected,且只能改变一次。它提供了链式调用和灵活的回调函数指定方式,解决了传统回调函数的问题。Promise的常用方法包括then、catch、resolve、reject、all和race,分别用于处理成功、失败、创建成功或失败的Promise、处理多个Promise的并行和竞争情况。P

2301_76459194的博客 1188

promise操作爬坑

promise 操作爬坑 建立promise对象 /* *******************************扫码操作********************************* */ scanQRCode:function(){ let promise = new Promise(function(resolve,reject){ uni.scanCode...

云间月 282

Promise是什么+源码解析

回调函数嵌套调用, 外部回调函数异步执行的结果是嵌套的回调执行的条件。

weixin_53541596的博客 464

promise的基本用法

Promise解决的问题 当一个异步任务的执行需要依赖另一个异步任务的结果时,我们一般会将两个异步任务嵌套起来,如下: Promise的基本用法 async1(function() { async2(function() { async3(function() { async4(function() { async5(function() ...

weixin_30606461的博客 121

Promise.all使用

Promise处理建议:1. 始终传入数组,即使单个Promise也应包装成数组形式;2. 不确定类型的值应使用Promise.resolve()显式包装。这两点可确保Promise处理的可靠性和一致性。

lexiangqicheng的博客 151
上一篇: DOM0、DOM2、DOM3 事件
下一篇: Promise 二:关键问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值