• JavaScript Promise


    Promise 是一个 ECMAScript 6 提供的类,目的是更加优雅地书写复杂的异步任务。

    由于 Promise 是 ES6 新增加的,所以一些旧的浏览器并不支持,苹果的 Safari 10 和 Windows 的 Edge 14 版本以上浏览器才开始支持 ES6 特征。

    构造 Promise 

    现在我们新建一个 Promise 对象:

    1. <script>
    2. new Promise(function(resolve,reject){
    3. //要做的事情...
    4. }
    5. script>

    通过新建一个 Promise 对象好像并没有看出它怎样“更加优雅地书写复杂的异步任务”。我们之前遇到的异步任务都是一次异步,如果需要多次调用异步函数呢?例如,我想分三次输出字符串,第一次间隔1秒,第二次间隔4秒,第三次间隔3秒:

    1. <script>
    2. setTimeout(function(){
    3. console.log("First");
    4. setTimeout(function(){
    5. console.log("Second");
    6. setTimeout(function(){
    7. console.log("Third");
    8. },3000);
    9. },4000);
    10. },1000);
    11. script>

    这段程序实现了这个功能,但是它是用“函数瀑布”来实现的。可想而知,在一个复杂的程序当中,用“函数瀑布”实现的程序无论是维护还是异常处理都是一件特别繁琐的事情,而且会让缩进格式变得非常冗赘。

    1. <script>
    2. new Promise(function (resolve, reject) {
    3. setTimeout(function () {
    4. console.log("First");
    5. resolve();
    6. }, 1000);
    7. }).then(function () {
    8. return new Promise(function (resolve, reject) {
    9. setTimeout(function () {
    10. console.log("Second");
    11. resolve();
    12. }, 4000);
    13. });
    14. }).then(function () {
    15. setTimeout(function () {
    16. console.log("Third");
    17. }, 3000);
    18. });
    19. script>

    这段代码较长,所以还不需要完全理解它,我想引起注意的是 Promise 将嵌套格式的代码变成了顺序格式的代码。

    Promise 的使用

    下面我们通过刨析这段 Promise “计时器”代码来讲述 Promise 的使用:

    Promise 构造函数只有一个参数,是一个参数,这个函数在构造之后会直接被异步运行,所以我们称之为起始函数,起始函数包含两个参数 resolve 和 reject。

    当 Promise 被构造时,起始函数会被异步执行:

    1. <script>
    2. new Promise(function(resolve,reject){
    3. console.log("Run");
    4. });
    5. script>

    这段程序会直接输出 Run 

    resolve 和 reject 都是函数,其中调用 resolve 代表一切正常,reject 是出现异常时所调用的:

    1. <script>
    2. new Promise(function (resolve, reject) {
    3. var a = 0;
    4. var b = 1;
    5. if (b == 0) reject("Divide zero");
    6. else resolve(a / b);
    7. }).then(function (value) {
    8. console.log("a / b = " + value);
    9. }).catch(function (err) {
    10. console.log(err);
    11. }).finally(function () {
    12. console.log("End");
    13. });
    14. script>

    这段程序执行结果是:

    a / b = 0

    End

    Promise类有。then().catch()和.finally()三个方法。这三个方法的参数都是一个函数,.then()可以将参数中的函数添加到当前Promise的正常执行序列,.catch()则是设定Promise 的异常处理序列,.finally()是在Promise执行的最后一定会执行的序列。.then()传入的函数会按顺序依次执行,有任何异常都会直接跳到catch序列:

    1. <script>
    2. new Promise(function (resolve, reject) {
    3. console.log(1111);
    4. resolve(2222);
    5. }).then(function (value) {
    6. console.log(value);
    7. return 3333;
    8. }).then(function (value) {
    9. console.log(value);
    10. throw "An error";
    11. }).catch(function (err) {
    12. console.log(err);
    13. });
    14. script>

    执行结果:

    1111

    2222

    3333

    An error

    resolve()中可以放置一个参数用于向下一个 then 传递一个值,then 中的函数也可以返回一个值传递给 then。但是,如果 then中返回的是一个 Promise 对象,那么下一个then将相当于对这个返回的 Promise 进行操作,这一点从刚才的计时器的例子中可以看出来。

    reject()参数中一般会传递一个异常给之后的catch函数用于处理异常。

    但是请注意以下两点:

                    resolve 和 reject 的作用域只有起始函数,不包括 then 以及其他序列;

                    resolve 和 reject 并不能够使起始函数停止运行,别忘了 return。

    Promise 函数

    上述的“计时器”程序看上去比函数瀑布还要长,所以我们可以将它的核心部分写成一个 Promise函数:

    1. <script>
    2. function print(delay,message){
    3. return new Promose(function(resolve,reject){
    4. setTimeout(function(){
    5. console.log(message);
    6. resolve();
    7. },delay);
    8. });
    9. }
    10. script>

    然后我们就可以放心大胆的实现程序功能了:

    1. <script>
    2. print(1000,"First").then(function(){
    3. return print(4000,"Second");
    4. }).then(function(){
    5. print(3000,"Third");
    6. });
    7. script>

    这种返回值为一个 Promise 对象的函数称作 Promise 函数,它常常用于开发基于异步操作的库。

  • 相关阅读:
    java计算机毕业设计花田音乐网站MyBatis+系统+LW文档+源码+调试部署
    Web大学生网页作业成品——环保垃圾分类网站设计与实现(HTML+CSS+JavaScript) web前端开发技术 web课程设计 网页规划与设计
    开源代码分享(22)-基于拉格朗日松弛的电动汽车分布式充放电调度
    宇视网络视频录像机升级步骤
    在线旅游平台步入新时代,携程如何走出自己的路?
    springboot属性注入增强(一)背景/需求
    HTML5期末大作业:HTML+CSS茶叶官网网页设计实例 企业网站制作
    有关 Rust 交叉编译的一些思路 (仅供参考)
    vscode 配置第三方库 opengl 开发
    java - 集合
  • 原文地址:https://blog.csdn.net/qq_56515781/article/details/125891253