【JavaScript】Promise教程、Promise的使用。

Promise从入门到提高实战教程 Promise状态:实例对象中的一个属性:PromiseState这个属性有3个值: pending(未决定的),resolved/fullfilled(成功),rejected(失败)。值的改变只有两种可能。pending 变为resolvedpending 变为rejected说明:只有这2种,且一个promise对象只能改变一次,无论变为成功还是失败,都会有一个结果数据。成功的结果数据一般称为value,失败的结果数据一般称为reason。 阅读详情

重要声明:本文章仅仅代表了作者个人对此观点的理解和表述。读者请查阅时持自己的意见进行讨论。

本文原文:【JavaScript】Promise教程、Promise的使用。。本文更新不及时建议到原文地址浏览。

Promise 是 ES6 加入的特性,它让异步任务更加合理和强大。越来越多的人开始使用它,我们也不能坐视不管,技术要点也必须要收入囊中。

尝鲜

正式介绍之前,先看一看Promise用起来通常是一个怎么样的体验。下面给出一个使用示列:

// 1
new Promise(function(resolve, reject) {
    try{
        var response = ajaxPost('https://www.baidu.com', {key: "Microanswer"})
        resolve(response)
    } catch (err) {
        reject(err)
    }

// 2
}).then(function(response) {
    if (response.code === 200) {
        return buildResult(response.data)
    } else {
        throw new Error("请求失败。")
    }

// 3
}).then(function (data) {
    render(data)

// 4
}).catch(function (err) {
    renderErr(err)
})

上述代码完成了一次请求,并将结果渲染到界面上。从代码标注上可看到,从请求到显示出数据一共分为了3步,第4步为错误结果展示。

第一步:发出一个请求Post请求。并使用try…catch进行异常捕获,这样可以捕获到因网络不通畅而导致的问题。

第二步:解析得到的请求返回内容,如果内容正确则构建结果。否则抛出错误。

第三步:渲染数据。

异常处理:此步在最后结尾处。前面任何一步,一但出错就会直接执行异常处理。

可以很容易发现,这其中没有出现过去使用回调函数的方式来保证异步任务结束后逻辑的正常结束,相反是一个接一个的 then 在后面链在一起。无疑这带来了代码执行流程上直观体验。

一、Promise 对象的创建

Promise 对象的创建方式常见的有两种,一种通过构造函数、另一种则通过其提供的静态方法。

1、通过构造函数

这种方式允许你兼容曾经使用回调函数来完成的异步任务。下面展示一个典型的创建方法:

var promise = new Promise(function (resolve, reject) {
    resolve("Hello Promise!")
})

这段代码构造了一个非常简单的promise对象。如果你还不了解其含义,下面将详细的进行讲解。现在先把目光放在Promise构造函数本身上。这是一个非常简单的构造函数,要成功构造Promise对象,只需要提供一个参数,这个参数是一个Function类型的即可,如上代码所示。当promise执行时,会调用这个方法,并传入两个参数,它们分别是 resolve 和 reject。

1)、resolve 参数

当你传递的 Function 执行完成后,必须要产生一个结果,为了Promise的正确执行,你需要告诉Promise,你的执行结果是正确,还是错误的。resolve 其实是一个方法,当你结果正确时,可通过调用 resolve(),标记执行完成并且结果正确,正确可以没有参数。如果你有参数则可以将参数放入其中,比如:resolve("Jack")。这就相当于完成了正确任务的标记,并将结果传达了下去。在此promise的下一个then里面,就可以拿到你传入的 "Jack" 了。例如:

var promise = new Promise(function (resolve, reject) {
    resolve("Jack");
})
promise.then(function (result) {
    console.log(result) // 输出:Jack
})
2)、reject 参数

无论什么任务,又特别是异步的耗时任务,出错是肯定避免不了的。因此当你的 Function 执行过程中出现了错误,reject 允许你把错误告诉给Promise。假如你的 Promise后面已经有许许多多的 then 任务节点,那么这些节点就都不会执行了,Promise 会一直寻找下面的catch方法,如果没找到则会报错:发现未捕获的异常xxx。下面示列一个典型的出错场景:

var promise = new Promise(function (resolve, reject) {
    reject(new Error("出错了"));
})
promise.then(function (result) {
    console.log(result) // 不会执行
}).catch(function (result) {
    console.log(result) // 打印:出错了
})

可以看到,在第一个构造函数内,直接使用 reject 指明出错了,Promise发现出错,开始向下寻找catch,直到最后发现一个catch,那么此时catch就立即执行,打印了错误信息。

通过构造函数创建promise实例现在有了一个基本的理解,因为其提供了resolve和reject,则将以前的异步任务(回调方法)得到了完美的兼容。

举例:在使用Promise前,就已经开发好了一个网络请求方法,使用了回调函数来获取请求结果,方法原型就像这样:

function post(url, param, callback) {
    $.ajax({
        ...,
        success: function (res) {callback(null, res)}
        error: function (err) {callback(err, null)}
    })
}

// 正常使用
post("https://www.baidu.com", {key: "Jack"}, function (err, res) {
    // 拿到请求结果。
})

现在有了Promise的加入,希望不要再这样使用回调函数,从而实现获取到请求结果。那么就可以使用Promise构造函数进行一次封装:

function postByPromise(url, param) {
   return new Promise(function (resolve, reject) {
       post(url, param, function (err, res) {
            if (err) reject(err) else resolve(res)
       })
   })
}

// 使用
postByPromise("https://www.baidu.com", {key: "Jack"})
    .then(function (res) {
        // 拿到请求结果。
    })

通过上述代码,可以看到,原来通过回调函数实现的异步任务,可以完美的使用Promise进行一次封装,从而实现链式的调用方式。

2、通过静态方法创建

通过静态方法创建promise对象同样可以使用 then 向后不停的链式调用。创建起来更加简单,甚至不需要你实现一点逻辑就可以创建一个promise对象。例如:

var promise = Promise.resolve("Jack");
promise.then(function (result) {
    console.log(result) // 打印:Jack
})

十分简单对不。这样创建出来的promise对象是一个明确标记为正确的promise对象,它的第一个catch永远都不会执行,除了创建一个正确的promise对象,Promise还提供了一个创建错误promise对象的方法:

var promise = Promise.reject("出错了");
promise.catch(function (err) {
    console.log(err); // 打印:出错了
})

二、进一步使用Promise

当你了解了上面的内容后,就可以开始进一步使用Promise来完成任务了。它还有许多特性是上面没有介绍到的,接下来就结合代码进行讲解。

1、出错后继续

上面的代码里,catch代码始终都在最后一个,但肯定不是每次任务执行步骤都只需要最后一个错误捕获,还有很多时候是要在中途就捕获,然后还有针对错误的任务处理的。下面来个示列:

Promise.resolve()
    .then(function () {
        return "name"                // 执行
    }).then(function (name) {
        return Promise.reject("出错") // 构建错误并返回
    }).then(function (resut) {
        return "age"                  // 不执行,因为错误还没被捕获。
    }).catch(function (err) {
        console.log(err)              // 执行,打印错误信息。
        return "处理了出错"
    }).then(function (msg) {
        comsole.log(msg)              // 执行,因为错误已被捕获且又返回了正确的msg
    })

上述代码中,中途构建了错误promise并返回了,后续发现有错误,就不会执行后续的then,可以看到紧接着的then并没有执行,然后紧接着发现catch,将错误交给这个catch运行,catch运行后返回了一个字符串,只要返回的不是错误的promise,那么Promise就都认为错误已经处理了,便会开始继续执行下面所有的then。

2、多个Promise

假如有这样一个需求:现在要同时发送3个请求,但业务逻辑必须等所有请求完成后进行,这时,如果用传统回调方式去处理,势必要写很多代码去维护是3个请求都完成了。现在有了 Promise 就可以非常方便完成这个需求:

var req1 = postByPromise("/xxx", {...})
var req2 = postByPromise("/zzz", {...})
var req3 = postByPromise("/yyy", {...})

// 全部同时执行
Promise.all([req1, req2, req3])
    .then(function (result) {
        var result1 = result.result1;
        var result2 = result.result2;
        var result3 = result.result3;
        // 三个请求都完成了,并且拿到了结果。
    })
3、出错后重试

经常网络请求出现失败,但是重新请求却又正常了,这是我们可以做一个出错失败的机制,让每次执行出错时都重试,并重试指定最大次数,超过次数则最终报错。

function postByPromiseTryCount(url, param, maxTryCount) {
    var tryCount = 0

    function d0(url, param) {
        return postByPromise(url, param).catch(function (err) {

            // 重试次数低于最大次数,可以继续重试。
            if (++tryCount < maxTryCount) {
                return d0(url, param)
            } else {
                return Promise.reject(err)
            }
        })
    }

    return d0(url, param)
}

上述 postByPromiseTryCount 方法是对 postByPromise 方法的封装,支持了失败自动重试功能。

4、注意事项

Promise尽管好用,但使用不当也会出现许多问题。以下罗列了我在使用时遇到的问题。

  1. 结合for循环使用时,如果是前端,最好使用封装的遍历方法,类似$.each之类的,而杜绝直接使用for循环。
  2. Promise内执行的任务都是异步的,并不是写在前面的代码就先执行,但在promise外部的代码总是先运行。
  3. 每一个then方法都可以传递2个参数,第一个是正确时执行的,第二个时错误时执行的,你可以不写catch函数,而把错误捕获函数放在第二个参数。
  4. 每个then方法都会返回一个新的promise对象,即便是你没有返回值,也会返回一个值为空的promise的对象,意味着你也可以继续then。
  5. 所以任务你如果要标记出错了,可通过返回错误的promise,也可以直接throw错误信息。

三、写在最后

本文只介绍了Promise的基本初级使用方式,还有许多高级用法没有介绍,希望更深入了解,可以点击这里查看。

【JS】Promise的完全基础入门教学 Promise的出现把JavaScript的异步函数的功能大大提升,并且解决了回调地狱的问题。本文将从promise的核心出发,仔细分析promise对于一个新手来说的意义和用法。 阅读详情

相关推荐

JS中的Promise(秒懂如何使用promise进行异步操作)

JavaScript中的Promise是一种用于处理异步操作的对象,它代表了一个尚未完成但最终会完成或失败的操作,目的是更加优雅地书写复杂的异步任务。Promise 是一种用于处理异步操作的 JavaScript 对象,它提供了一种更清晰、更可靠的方式来管理异步代码。简化异步操作:Promise 可以帮助我们更轻松地处理异步操作,以及在操作完成后执行相应的逻辑。链式调用:通过使用 .then() 方法,我们可以将多个异步操作链接在一起,形成一个链式调用,使代码更加清晰易读。明确的状态变化。

百赢出品,必属精品 2万+

javaScript中Promise简单介绍和理解

文章,大概描述Promise的一些概念,和相关的方法,(pending、fulfillen、rejected三种状态).then()、.catch()、.finally()、.all()、.race()方法介绍区别等,以及实例可供查看,以及后面有部分事件循环、宏任务、微任务的相关介绍和例子

qq_42446479的博客 5874

从零到一:手把手教你构建自定义ReaxFF力场参数

本文手把手教你从零构建自定义ReaxFF力场参数,详解反应力场的动态键序机制与参数化逻辑。通过LAMMPS实战演示,涵盖训练数据准备、参数优化算法选择及性能优化技巧,助力研究人员精准模拟化学反应过程。适用于材料科学、催化研究等领域,特别适合已掌握分子动力学基础的进阶用户提升力场开发能力。

weixin_28365523的博客 1057

简单易懂的Promise基础教程(小白入门)

promise的入门基础知识,简单了解promise的三种状态

潮汐未见潮落的博客 6324

保姆级教程:在PX4 Gazebo仿真中为Iris无人机挂载Intel D435i深度相机(含完整配置流程)

本文提供在PX4 Gazebo仿真环境中为Iris无人机挂载Intel D435i深度相机的完整配置流程,涵盖环境准备、模型部署、插件安装及调试技巧。通过详细步骤和常见问题解决方案,帮助开发者快速搭建深度相机仿真环境,适用于无人机视觉开发与算法测试。

weixin_28688385的博客 337

K2P padavan固件下宽带与IPTV融合

举例说下,假如你的IPTV是拨号的,IPTV端口直接连到笔记本电脑的网口,IP是自动分配的情况下,在VLC里面是可以直接播放“rtp://239.XXX.XXX.XXX:XXXX”的,即使IPTV是DHCP模式,按道理也是可以播放的。家里很少看电视,基本上就是看看春晚,然后平时老人在家没事看看,所以就把广电的机顶盒停掉了,换了一个N1的盒子刷了CoreELEC系统,既可以通过m3u8文件看网络电视,也可以看本地的多媒体,很方便,完全满足了自己的需求。在上图的第三步中,端口设置成大于1024的端口即可。

aplsc的专栏 63万+

JavaScript Promise 教程 - 如何在 JS 中解决或拒绝 Promise

JavaScript Promise Tutorial – How to Resolve or Reject Promises in JShttps://www.freecodecamp.org/news/javascript-promise-tutorial-how-to-resolve-or-reject-promises-in-js/ Promise是 JavaScript 中异步操作的重要组成部分。你可能认为 Promise 不是那么容易理解、学习和使用的。相信我,你并不孤单! 对于许多 We.

allway2的博客 2071

从零构建:毫米波雷达生命信号检测系统的Matlab仿真全流程解析

本文详细解析了毫米波雷达生命信号检测系统的Matlab仿真全流程,涵盖原理、信号处理链路设计及算法优化策略。通过FMCW雷达技术,实现非接触式呼吸心跳信号检测,结合Matlab代码示例展示距离FFT、相位提取与信号分离等关键步骤,为医疗监护和智能家居应用提供实用指南。

weixin_29303701的博客 355

ajax 实现 promise,Promise.js 是 Promises 的轻量级 JavaScript 实现 - 文章教程

Promise.js 是 Promises 的轻量级 JavaScript 实现,Promises 提供了 callback-passing 的替代方案,异步函数返回一个 Promise 对象可附加到 callbacks 中。使用 Promise 对象Promise 提供一个替代的回调传递。异步函数返回一个承诺对象上回调可以连接。回调连接使用 .then(callback) 的方法。他们将被称为当...

weixin_39951018的博客 258

3DE重客户端安装

3DE重客户端安装

m0_48170265的博客 9427

基于JeecgBoot 3.9.0 开源项目的企业管理平台

基于JeecgBoot 3.9.0 开源项目的企业管理平台

宁波阿成的博客 374

Node.js 入门教程 33 了解 JavaScript Promise

Node.js 入门教程 33 了解 JavaScript Promise

代码改变世界 222

DLMS/COSEM协议的理解体会

DLMS是通信协议,COSEM是电表建模规范。HDLC帧基本格式为0x7e......

一个bug是bug,多个bug能work 8312

《现代JavaScript高级教程》JS中的异步编程与Promise

以上是关于 JavaScript 中异步编程、事件循环、任务队列、宏任务、微任务,以及requestAnimationFrame在事件循环的位置,Promise 的发展和如何解决回调地狱的详细介绍。requestAnimationFrame 的位置在事件循环中的具体位置是视浏览器的实现而定,但一般来说,它在宏任务执行完,渲染之前,这使得其可以获取到最新的布局和样式信息。事件循环是 JavaScript 内部的一个处理过程,系统会在此处不断地循环等待,检查任务队列中是否有任务,如果有,就处理它。

linwu的博客 257

智能Agent如何重塑企业流程

在当今数字化时代,企业流程的效率和敏捷性至关重要。传统企业流程往往受限于人工操作,效率低下、成本高昂,难以适应快速变化的市场环境。智能Agent作为一种新兴技术,凭借其强大的智能化能力,正在逐渐改变企业流程的运作模式,为企业带来新的机遇和挑战。智能Agent是一种能够感知环境、自主决策、执行任务的软件实体。它可以模拟人类的智能行为,例如学习、推理、规划和沟通。通过将智能Agent嵌入到企业流程中,可以实现流程的自动化、优化和智能化,从而提高效率、降低成本、提升客户体验。8.1 研究成果总结。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 874

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JavaScript Promise教程:JS和ES6中的解析,拒绝和链接

Promises are one of the ways we can deal with asynchronous operations in JavaScript. Many people struggle with understanding how Promises work, so in this post I will try to explain them as simply as ...

418

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JavaScript Promise 使用教程

本文全面介绍了JavaScript中的Promise对象及其使用方法。主要内容包括:1. Promise的基本概念和使用方法,包括创建Promise对象、状态改变机制和基本流程;2. Promise的常用方法如then()、catch()、all()、race()等;3. Promise的关键问题解析,如状态改变、回调执行顺序、链式调用等;4. 自定义Promise实现;5. 多种Promise顺序执行方案,包括链式调用、async/await、reduce等;6. 宏队列和微队列的执行机制。文章通过大量代

jacky choise 818

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JavaScript Promiseの本测试教程:使用Mocha进行Promise测试

JavaScript Promise是异步编程的重要概念,而Mocha是JavaScript中最流行的测试框架之一。本教程将详细介绍如何使用Mocha进行Promise测试,帮助开发者编写可靠的异步代码测试。 ## Mocha对Promise的支持 Mocha原生支持Promise测试,允许开发者直接返回Promise对象而无需使用传统的done()回调函数。这种方式可以显著简化异步测试代码,

gitblog_00261的博客 1057

【视频教程】Javascript ES6 教程28—ES6 Promise 实例应用

我们接着前面第27节内容继续学习。今天开始第28节课的内容《ES6 Promise 实例应用》,希望对你有所帮助。在这里,简单说明一下,这个系列的视频教程视均来源Youtube,一共有54...

web前端开发 231

promise用法_【JavaScript 教程】异步操作——Promise 对象

作者 | 阮一峰概述Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口。它起到代理作用(proxy),充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口。Promise 可以让异步操作写起来,就像在写同步操作的流程,而不必一层层地嵌套回调函数。注意,本章只是 Promise 对象的简单介绍。为了避免与后续教程的重复,更完整的介绍请看《E...

weixin_39554891的博客 122

JavaScript教程(十三)--- 使用 Promise

​ Promise是一个对象,它代表了一个异步操作的最终完成或者失败。因为大多数人仅仅是使用已创建的 Promise 实例对象,所以本教程将首先说明怎样使用 Promise,再说明如何创建 Promise。 本质上 Promise 是一个函数返回的对象,我们可以在它上面绑定回调函数,这样我们就不需要在一开始把回调函数作为参数传入这个函数了。

IT小猿 1259

Promise Poller 使用教程

Promise Poller 使用教程 项目介绍 promise-poller 是一个用于轮询异步任务的 JavaScript 库。它允许你以固定间隔或其他策略(如线性回退、指数回退)轮询一个异步任务,直到任务成功或达到最大重试次数。这个库非常适合需要定期检查后台任务状态的场景。 项目快速启动 安装 首先,你需要通过 npm 安装 promise-poller: npm install promi...

gitblog_00790的博客 509

JavaScript 教程:深入理解 Promise API

Promise 是 JavaScript 异步编程的核心概念之一,它提供了比传统回调函数更优雅的异步处理方式。本文将全面解析 Promise 类提供的 6 个静态方法,帮助你掌握 Promise 的高级用法。 ## 为什么需要 Promise API 在复杂的异步编程场景中,我们经常需要处理多个异步操作的组合、竞争或依赖关系。Promise API 提供了一系列静态方法来简化这些常见模式的处理

gitblog_00180的博客 480

【JavaScript 教程】异步操作——Promise 对象

作者 | 阮一峰概述Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口。它起到代理作用(proxy),充当异步操作与回调函数之间的中...

web前端开发 283

Chrome Promise 项目教程

Chrome Promise 项目教程 1. 项目的目录结构及介绍 chrome-promise/ ├── LICENSE ├── README.md ├── dist/ │ ├── chrome-promise.js │ └── chrome-promise.min.js ├── examples/ │ ├── background.js │ ├── manifest.json ...

gitblog_00149的博客 431
上一篇: 【Vue,Vuex】为你的vue项目添加vuex支持,并实现全局动态主题颜色修改
下一篇: 【Java,二维码】Java 使用 swetake 生成二维码图片
Microanswer
博客等级 码龄10年 38粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值