通俗的解释什么是Promise

通俗的解释什么是Promise**说了这么多其实翻译成大白话就是:**1、媳妇儿饿了需要吃饭,所以我要上街买菜(**异步方法**)2、我什么时候买完菜回来她不知道(**异步方法执行几秒未知**),3、但是买完菜回到家之后我会马上做个红烧排骨给媳妇吃(**异步方法执行结束之后需要对返回值做处理**)这时候怎么办呢,就用promise(承诺):就说这个事情交给我吧,我承诺我去买菜,买完回来马上给你做红烧排骨,做完马上就叫你吃(这个地方相当于**promise链式调用**),你现在该干嘛干嘛去,去刷抖音,打游戏都可以(**不影响其他

大家好,又见面了,我是你们的朋友全栈君。

Promise是什么?

Promise英文翻译过来意为承诺,许诺。它的作用就像中文意思一样,是一种许诺。

MDN的解释:
Promise 对象是一个代理对象(代理一个值),被代理的值在Promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象。

说了这么多其实翻译成大白话就是:
1、媳妇儿饿了需要吃饭,所以我要上街买菜(异步方法
2、我什么时候买完菜回来她不知道(异步方法执行几秒未知),
3、但是买完菜回到家之后我会马上做个红烧排骨给媳妇吃(异步方法执行结束之后需要对返回值做处理
这时候怎么办呢,就用promise(承诺):
就说这个事情交给我吧,我承诺我去买菜,买完回来马上给你做红烧排骨,做完马上就叫你吃(这个地方相当于promise链式调用),你现在该干嘛干嘛去,去刷抖音,打游戏都可以(不影响其他代码的调用)。

一个 Promise有以下几种状态:
pending: 初始状态,既不是成功,也不是失败状态(我出门去买菜了,你等我回来)
fulfilled: 意味着操作成功完成。(买完菜回到家告诉媳妇儿我买到你要吃的菜了)
rejected: 意味着操作失败。(我没买到菜,你要不点个外卖吧)

pending 状态的 Promise 对象可能会变为fulfilled 状态并传递一个值给相应的状态处理方法,也可能变为失败状态(rejected)并传递失败信息。当其中任一种情况出现时,Promise 对象的 then 方法绑定的处理方法(handlers )就会被调用。
then方法包含两个参数:onfulfilled 和 onrejected,它们都是 Function 类型。当Promise状态为fulfilled时,调用 then 的 onfulfilled 方法,当Promise状态为rejected时,调用 then 的 onrejected 方法, 所以在异步操作的完成和绑定处理方法之间不存在竞争)。
在这里插入图片描述

看一段基础示例:

            new Promise((resolve, reject) => {
                console.log('code begin !');
                 let num = 4;
                // 假装执行一个异步方法
                setTimeout(() => {
                    console.log('async begin !');
                    num += 2;
                    // 把Promise状态设为fulfilled,并把结果传递出去
                    resolve(num);
                    // 把Promise状态设为rejected,并把失败信息传递出去
                    //reject('promise被手动中止');
                    // throw 'uncaught exception!'; // 这里要注意,catch无法捕获在异步方法里抛出的异常
                }, 1000);
            }).then((result) => { // 当Promise的状态被设为接受(fulfilled)时执行
                console.log('fulfilled :' + result);
            }, (reason) => { // 当Promise的状态被设为拒绝(rejected)时执行
                console.log('rejected :' + reason);
            }).catch((error) => { 
                console.log('error :' + error);
            }).finally(() => {
                // do something !
            });
                

then 方法返回一个 Promise。它最多需要有两个参数:Promise 的成功和失败情况的回调函数。

catch 方法当执行过程出现异常时执行,或Promise的状态被设为失败(rejected),并且没有设置rejected执行函数时也会执行。另外catch无法捕获在异步方法里抛出的异常

finally 方法由于无法知道promise的最终状态,所以finally的回调函数中不接收任何参数,它仅用于无论最终结果如何都要执行的情况。

另外Promise可以链式调用,如果then方法执行结束并返回一个新的Promise,那么将会按照顺序依次执行then方法。但是这里有一点要注意下:如果调用链中有一个出现异常或者状态被改为拒绝,那么调用链中剩下的就不会被执行。所以在使用链式调用时要慎重!

代码示例:

            new Promise((resolve, reject) => {
                console.log('code begin !');
                let num = 4;
                setTimeout(() => {
                    console.log('num + 2 = 6');
                    num += 2;
                    resolve(num);
                }, 1000);
            }).then((num) => {
                return new Promise((resolve, reject) => {
                    console.log('num * num = 36');
                    setTimeout(() => {
                        num *= num;
                        resolve(num);
                    }, 1000);
                });
            }).then((num) => {
                return new Promise((resolve, reject) => {
                    console.log('num + num = 72');
                    setTimeout(() => {
                        num += num;
                        resolve(num);
                    }, 1000);
                });
            }).then((result) => {
                console.log('fulfilled :' + result);
            }, (reason) => {
                console.log('rejected :' + reason);
            }).catch((error) => {
                console.log('error :' + error);
            }).finally(() => {
                // do something !
            });

在这里插入图片描述
Promise还有一些其他的方法例如 Promise.all(iterable):可以传递一个iterable(类似于数组)进去,它会等待iterable里的所有promise执行完毕后统一返回,返回的结果也是一个数组,将会按照参数内的 promise 顺序排列,而不是由调用 promise 的完成顺序决定.

	    Promise.all([mothod1(), mothod2()])
	         .then((result) => {
	             console.log('all complete');
	             console.log(result);
	         });
                
       function mothod1() {
            console.log('first mothod');
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve('mothod1 complete');
                }, 2000);
            });
        }
        function mothod2() {
            console.log('second mothod');
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve('mothod2 complete');
                }, 1000);
            });
        }

在这里插入图片描述

Promise.race(iterable):可以传递一个iterable(类似于数组)进去,一旦iterable中的某个promise解决或拒绝, promise就会解决或拒绝。

			Promise.race([mothod1(), mothod2()])
                .then((result) => {
                    console.log(result);
                    console.log('complete');
                });

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144130.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • labview怎么做成应用程序(labview程序识别形状)

    labview是一款领先的图形化提供设计软件,labview也是一种图形化的编程语言的开发环境,labview更是NI设计平台的核心。历经不断创新,发布了版本labview2019,提供了最佳的解决方案,让用户轻松利用数据快速做出明智的决策。labview2016同样是一款可以帮助工程师完成从设计到测试等一系列步骤以及开发大中小型系统的图形化编程平台,软件以前所未有的程度集成了现有传统软件、IP和…

    2022年4月14日
    80
  • 视频加密怎么播放_win播放器加密视频

    视频加密怎么播放_win播放器加密视频如何实现视频加密全平台播放

    2022年4月21日
    204
  • 我现在A函数开启事务,然后调用B函数,B函数中也开启了事务

    我现在A函数开启事务,然后调用B函数,B函数中也开启了事务

    2022年2月8日
    44
  • [电池]Android 9.0 电池未充电与充电字符串提示信息[通俗易懂]

    [电池]Android 9.0 电池未充电与充电字符串提示信息[通俗易懂]1.电池电量提醒1.1未充电提醒若没有预估时间,则提示显示电池百分比若预估时间小于7分钟,则提示手机可能即将关机若预估时间小于15分钟,则提示剩余电池续航时间不到15分钟若15分钟<预估时间<1天,则提示估计大约还能用到xxh,xxmin,xxsec若预估时间大于1天,则提示大约还可使用1days,xhr,xmin,xsec若预估时间大于2…

    2025年8月4日
    3
  • Qt小软件:LanFileSender(局域网文件传输小工具)

    Qt小软件:LanFileSender(局域网文件传输小工具)最近写了一个局域网文件传输小工具,自己用了一段时间了,觉得也稳定了,发出来分享一下。开启后会自动搜索局域网内的主机,然后直接发送文件就可以了。可以设置昵称和存储目录(默认在下载文件夹下)截图:功能详解:File:添加文件Director:添加文件夹Clear:清空文件列表Send:发送文件Ping:发送ping(不是CMD的那个p

    2022年6月3日
    29
  • 大疆网上测评题库_一份完整的大疆2018校招笔试题和面经送给大家~

    大疆网上测评题库_一份完整的大疆2018校招笔试题和面经送给大家~听说周日大疆就要笔试了,今年的秋招来的有点让人猝不及防啊,牛客的各种讨论群里都弥漫着一种恐惧的氛围,我是谁,我在哪,我该怎么办(惊恐脸)。。。。。哈哈哈没关系,作为一个刚刚踏上工作岗位的老学长,去年秋招在牛客网收获颇丰,是时候来回馈一波牛客网,回报一下牛妹了;)话不多说,干货奉上2018秋招大疆机器学习、算法笔试题1、两个小车,走一步能量消耗1,方向为1向右,-1为向左,首先输入路途长度,然后输…

    2022年6月29日
    97

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号