ES6:promise简单学习

news2024/11/15 2:14:08

一、理解promise

Promise将异步执行的程序变成同步执行,所谓的在开发中解决回调嵌套的问题
Promise 是异步编程的一种解决方案
从语法上讲,promise是一个对象
从它可以获取异步操作的消息
从本意上讲,它是承诺,承诺它过一段时间会给你一个结果
创造promise实例后,它会立即执行
Promise  对象用于表示一个异步操作的最终完成 (或失败)及其结果值

二、promise三种状态

待定(pending):初始状态,既没有被兑现,也没有被拒绝。
已兑现(fulfilled):操作成功。
已拒绝(rejected):操作失败。
promise状态一旦改变,就不会再变。

一个 Promise 对象代表一个在这个 promise 被创建出来时不一定已知的值。它让您能够把异步操作最终的成功返回值或者失败原因和相应的处理程序关联起来。 这样使得异步方法可以像同步方法那样返回值:异步方法并不会立即返回最终的值,而是会返回一个 Promise ,以便在未来某个时候把值交给使用者。

待定状态的 Promise 对象要么会通过一个值被兑现(fulfilled),要么会通过一个原因(错误)被拒绝(rejected)。当这些情况之一发生时,我们用 promise 的 then 方法排列起来的相关处理程序就会被调用。如果 promise 在一个相应的处理程序被绑定时就已经被兑现或被拒绝了,那么这个处理程序就会被调用,因此在完成异步操作和绑定处理方法之间不会存在竞争状态。

三、Promise原理

promise对象是由关键字 new 及其构造函数来创建的。该构造函数会把一个叫做“处理器函数”(executor function)的函数作为它的参数。这个“处理器函数”接受两个函数resolve 和 reject 作为其参数。当异步任务顺利完成且返回结果值时,会调用 resolve 函数;而当异步任务失败且返回失败原因(通常是一个错误对象)时,会调用 reject 函数。

四、promise解决回调嵌套问题

4.1、正常执行

function one (){ return 'i am one'}
function two (){ return 'i am two'}
function three (){ return 'i am three'}

function run (){
    console.log(one())
    console.log(two())
    console.log(three())
}
run()
// i am one
// i am two
// i am three

4.2、出现问题

function one (){ return 'i am one'}
function two (){
    setTimeout(()=>{
        return 'i am two'
    }, 2000)
}
function three (){ return 'i am three'}
function run (){
    console.log(one())
    console.log(two())
    console.log(three())
}
run()
// i am one
// undefined
// i am three

4.3、promise解决问题 

function one (){ return 'i am one'}
function two (){
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            resolve('i am two')
        }, 2000)
    })
}
function three (){ return 'i am three'}
function run (){
    console.log(one())
    console.log(two())
    console.log(three())
}
run()
// i am one
// Promise {<pending>}
// i am three

 

4.4、配合 async await

function one (){ return 'i am one'}
function two (){
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            resolve('i am two')
        }, 2000)
    })
}
function three (){ return 'i am three'}
async function run (){
    console.log(one())
    console.log(await two())
    console.log(three())
}
run()
// i am one
// Promise {<pending>}
// i am two
// i am three

五、Promise方

5.1、Promise.all()

const createPromise = (delay, flag = true)=>{
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            flag ? resolve(console.log(`成功${delay}`)) : reject(console.log(`失败${delay}`))
        },delay)
    })
}

//----失败-------
createPromise(500, false)
//失败500
//-----成功----------
createPromise(500)
成功500


Promise.all(createPromise(1000), createPromise(2000), createPromise(3000))
    .then((res)=>{
        console.log('成功', res)
    })
    .catch((err)=>{
        console.log('失败', err)
    })
// 成功1000
// 成功2000
// 成功3000

 

5.2、Promise.allSettled()

5.3、Promise.any()

5.4、Promise.prototype.catch()

5.5、Promise.prototype.finally()

5.6、Promise.race() 谁快谁先执行

const createPromise = (delay, flag = true)=>{
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            flag ? resolve(console.log(`成功${delay}`)) : reject(console.log(`失败${delay}`))
        },delay)
    })
}

Promise.race(createPromise(3000), createPromise(2000, false), createPromise(1000))
    .then((res)=>{
        console.log('成功', res)
    })
    .catch((err)=>{
        console.log('失败', err)
    })
// 成功1000
// 失败2000
// 成功3000

  

5.7、Promise.reject()

5.8、 Promise.resolve()

5.9、Promise.prototype.then()

六、promise项目中使用

6.1、实现sleep函数

  function sleep(ticks) {
    return Promise.resolve().then(() => {
      return ticks && sleep(ticks - 1);
    });
  }

6.2、实现sleep函数 

function sleep (seconds) {
  return new Promise((resolve) => {
     setTimeout(() => {
       resolve()
     }, seconds * 1000)
  })
}

6.3、实现同步请求

function myAsyncFunction(url) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open("GET", url);
    xhr.onload = () => resolve(xhr.responseText);
    xhr.onerror = () => reject(xhr.statusText);
    xhr.send();
  });
};

6.4、nuxt3项目promise简单封装请求

nuxt3:我们开始吧-开发-配置-部署_snow@li的博客-CSDN博客

import { ElMessage } from 'element-plus'
 
const fetch = (url: string, options?: any): Promise<any>  => {
    const token = useCookie("token");
    const headers = { // headers信息
        'Authorization' : `Bearer ${token.value}`
    }
    const { public: { baseUrl } } = useRuntimeConfig()
    const reqUrl = baseUrl + url
    return new Promise((resolve, reject) => {
        useFetch(reqUrl, { ...options, headers }).then(({ data }: any) => {
            const value = data.value
            if (!data._rawValue) {
                // 这里处理错误回调
                reject(value)
            }else if(data._rawValue.code !== '0'){
                ElMessage({
                    message: data._rawValue.msg,
                    type: 'error',
                })
            } else {
                console.log('40data', data._rawValue)
                resolve(ref(data))
            }
        }).catch((err: any) => {
            reject(err)
        })
    })
}
 
export default new class Http {
 
    get(url: string, params?: any): Promise<any> {
        return fetch(url, { method: 'get', params })
    }
 
    post(url: string, params?: any): Promise<any>  {
        return fetch(url, { method: 'post', params })
    }
 
    put(url: string, body?: any): Promise<any>  {
        return fetch(url, { method: 'put', body })
    }
 
    delete(url: string, body?: any): Promise<any>  {
        return fetch(url, { method: 'delete', body })
    }
}

6.5、Promise同步请求

let myPromise = new Promise(function(resolve, reject){
    //当异步代码执行成功时,我们才会调用resolve(...)
    //当异步代码失败时就会调用reject(...)
    //在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或其他内容
    setTimeout(function(){
        resolve("执行成功!")
    }, 250);
});

myPromise.then(function(successMessage){
    //successMessage的值是上面调用resolve(...)方法传入的值
    console.log("Yay! " + successMessage);
});

6.6、Promise链式调用

let c = new Promise((resolve, reject)=>{
    resolve(100)
})
.then((res)=>{
    return new Promise((resolve)=>{
        resolve(800 + res)
    })
    // 这里的结果作为下一个then的res返回供使用
})
.then((res)=>{
    console.log(res)
})
// 900

七、相关内容

宏任务、微任务 、Generator 、Async / Await

八、欢迎交流指正,关注我,一起学习。

九、参考文献

Promise - JavaScript | MDN

(15条消息) Promise不会??看这里!!!史上最通俗易懂的Promise!!!_weixin_33704234的博客-CSDN博客

(15条消息) promise的用法与定义。_一直在路上的小仙女的博客-CSDN博客_promise的用法

(15条消息) Promise到底解决了什么问题?_weixin_34335458的博客-CSDN博客

ES6 Promise用法讲解 - Samve - 博客园

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

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

相关文章

Java入门超详细(内含Java基础 Java高级)

Java基础入门 - 内含Java基础&#xff0c;Java高级 Java 基本介绍Java 学习须知Java 学习文档Java 基础Java 基础语法Java 对象与类Java 基本数据类型Java 变量类型Java 修饰符Java 运算符Java 循环结构Java 条件语句Java switch caseJava 数组Java 日期与时间Java 正则表达式J…

Swift AsyncSequence — 代码实例详解

前言 AsyncSequence 是并发性框架和 SE-298 提案的一部分。它的名字意味着它是一个提供异步、顺序和迭代访问其元素的类型。换句话说&#xff1a;它是我们在 Swift 中熟悉的常规序列的一个异步变体。 就像你不会经常创建你的自定义序列一样&#xff0c;我不期望你经常创建一个…

2022 Jiangsu Collegiate Programming Contest A. PENTA KILL!

题目链接 Sample 1 Input 10 Bin Guigo Grevthar Bin GALA Grevthar GALA TitaN GALA Guigo GALA Aegis GALA Jojo GALA Grevthar Xiaohu Grevthar GALA Aegis Output PENTA KILL! Sample 3 Input 7 GALA Jojo Aegis Ming GALA Grevthar GALA Grevthar GALA Aegis GALA Guigo…

树莓派硬件介绍及配件选择

目录 树莓派Datasheet下载地址&#xff1a; Raspberry 4B 外观图&#xff1a; 技术规格书&#xff1a; 性能介绍&#xff1a; 树莓派配件选用 电源的选用&#xff1a; 树莓派外壳选用&#xff1a; 内存卡/U盘选用 树莓派Datasheet下载地址&#xff1a; Raspberry Pi …

CompletableFutrue异步处理

异步处理 一、线程的实现方式 1. 线程的实现方式 1.1 继承Thread class ThreadDemo01 extends Thread{Overridepublic void run() {System.out.println("当前线程:" Thread.currentThread().getName());} }1.2 实现Runnable接口 class ThreadDemo02 implements …

故障:更新后电脑卡顿

前一天下班的时候关电脑&#xff0c;关机选项变成了“更新并关机”&#xff0c;没多想&#xff0c;我点了。。。。早上上班就发现电脑卡得不行&#xff0c;看了下更新日志&#xff0c;装了一大堆东西&#xff0c;看了下任务管理器&#xff0c;内存直接跑到了90%&#xff0c;这电…

每日学术速递5.2

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.DataComp: In search of the next generation of multimodal datasets 标题&#xff1a;DataComp&#xff1a;寻找下一代多模态数据集 作者&#xff1a;Samir Yitzhak Gadre, Gab…

【JAVA模块六------ 综合案例基础巩固】

JAVA模块六------ 综合案例基础巩固 1 逢7跳过2 数组元素求和3 判断两个数组的内容是否相同4 查找某个数组元素索引5 数组元素反转输出&#xff1a;&#xff08;逆序输出&#xff09;6 评委打分7 随机产生验证码其他&#xff1a;方法抽取&#xff1a; 1 逢7跳过 要求&#xff1…

国产光伏仪器 6581太阳能电池板伏安特性测试仪

6581太阳能电池板伏安特性测试仪主要用于太阳能电池板生产的最终测试&#xff0c;也可以作为层压前测试使用&#xff0c;能大大提高一次封装成品率。该测试仪适合于单晶、多晶、薄膜等多种电池组件&#xff0c;可进行I-V曲线、P-V曲线、短路电流、开路电压、峰值功率等全部参数…

Hive SQL on Flink 构建流批一体引擎

摘要&#xff1a;本文整理自阿里巴巴开发工程师罗宇侠、阿里巴巴开发工程师方盛凯&#xff0c;在 Flink Forward Asia 2022 流批一体专场的分享。本篇内容主要分为五个部分&#xff1a; 1. 构建流批一体引擎的挑战 2. Hive SQL on Flink 3. 流批一体引擎的收益 4. Demo 5. 未来…

做到“有效沟通”,帮你达到这3个目的

在项目管理中&#xff0c;团队沟通是至关重要的。团队成员之间应该建立良好的沟通机制&#xff0c;及时沟通和协调问题&#xff0c;避免出现问题后甩锅的情况。 在实际项目中&#xff0c;很多问题出现的原因是团队沟通不畅&#xff0c;项目经理需要加强团队沟通的重要性&…

K8S二进制安装报错及各个组件功能介绍

目录 一、K8S安装二、安装时遇到的几个问题2.1、Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kuberne…

C语言复习笔记2

1.变量命名只能以数字、字母、下划线组成并且不能以数字开头。 #include<stdio.h> #include<unistd.h>//变量名只能由数字字母下划线组成&#xff0c;不能以数字开头 int main() {//int 2b;return 0; }2.内存中保存的是补码 0的补码取反得补码再求源码是-1。 源码…

提升论文影响力的方法

论文发表后&#xff0c;还有一些重要的工作去做&#xff0c;那就是去积极宣传和推广自己的论文&#xff0c;提高自己论文的影响力。这类似于一个电影上映后&#xff0c;主演们还得去做宣传一样&#xff0c;要想办法推销自己的作品。本文将介绍提升论文影响力的方法。 1. 开源数…

xray简单使用指南

前言收到需求如下 用户还需要一个报告 询问了群里的小伙伴推荐使用xray进行扫描 一、下载 https://github.com/chaitin/xray/releases windows下载amd64即可 解压后进入其目录下执行exe程序&#xff0c;帮我们生成一些yaml文件 生成 ca 证书 .\xray_windows_amd64.exe g…

创客匠人:五月,爱成长的力量,有爱必赢

2023年5月4日&#xff0c;创客匠人第六十九届铁军训练营在厦门举办&#xff0c;由创客匠人CEO蒋洪波、CSO张潇峰及HRM何巧婷为厦门总部的伙伴们带来精彩的回顾总结及主题分享。 一、四月总结 为了明确前进奋斗的方向&#xff0c;进一步提升团队战斗力&#xff0c;从而更好地帮助…

Altium Designer中如何在顶层中添加对应端口

转载说明&#xff1a; 大众深度科普 https://jingyan.baidu.com/article/c33e3f4889f327ea15cbb584.html 版权归原作者所有&#xff1b;感谢原作者的分享&#xff1b; 转载到此&#xff0c;主要为了后期查看方便&#xff1b; 本经验简要介绍Altium Designer中如何在顶层中添…

SpringBoot【开发实用篇】---- 热部署

SpringBoot【开发实用篇】---- 热部署 1. 手动启动热部署2. 自动启动热部署3. 参与热部署监控的文件范围配置4. 关闭热部署 什么是热部署&#xff1f;简单说就是你程序改了&#xff0c;现在要重新启动服务器&#xff0c;嫌麻烦&#xff1f;不用重启&#xff0c;服务器会自己悄悄…

人类创新发展的四个阶段:三个核心和一个扩展

纵观人类的发展史&#xff0c;始终伴随着人类的创新过程&#xff0c;这也是人类与其他生物体的最大的区别&#xff0c;别的生物体也就是可以使用工具或者模仿别的生物的动作来制造简单的工具&#xff0c;对工具进行简单的拼接&#xff0c;只有人类是可以进行真正的创造出这个自…

记录-Symbol学习笔记

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 Symbol是JavaScript中的原始数据类型之一&#xff0c;它表示一个唯一的、不可变的值&#xff0c;通常用作对象属性的键值。由于Symbol值是唯一的&#xff0c;因此可以防止对象属性被意外地覆盖或修改。…