码迷,mamicode.com
首页 > 其他好文 > 详细

关于Promise

时间:2020-05-20 22:46:32      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:ima   异步   不可   函数的参数   是什么   同步   class   set   mamicode   

关于Promise

关于Promise踩了很多的坑,记录一下

Promise是什么

Promise,直译的话就是承诺。实际上我觉得这样还难懂。实际上他就是一个异步操作状态的容器。

首先对于一个异步操作来说的话,因为他是没有等到运行完成就直接返回的,那么对于我们来说就需要有一个东西(容器),我们约定如果你完成/失败了的话,那么就把你完成/失败了的结果和状态放到这个东西里面。然后我不在需要理会这个异步操作,我只需要检查这个盒子我就知道了这个异步操作是否结束,进行到哪一步了。

因为js是单线程的,所以他的所有异步操作都会返回一个Promise。当你检查这个Promise的状态为fulfilled 了以后这个操作就已经完成了。

同时,当我们新建一个Promise的时候,例如

//...定义函数fn
new Promise(fn);
// Promise((res, rej) => {// ....})

我当然知道上面写的是错的,作为Promise函数的参数应该有两个参数,并且总是需要结束的(resolve/reject),但是需要先忽略这一点。我想说的是实际上在我们创建了一个Promise以后,那个被提供给创建的作为参数的函数就已经在被执行了。

实际上创建一个Promise就是同时创建并执行了一个异步函数,不管你提供作为参数的函数是异步还是同步的,他总是会被异步的执行。同时你提供的函数在某个特定的时刻都应该调用resolve / reject,否则这个异步操作永远不会是完成状态的。

好了现在我们知道了两点:

  1. 执行一个异步函数总是返回(创建并返回)Promise,Promise是异步函数结果的容器
  2. 创建一个Promise总是会执行一个异步函数,Promise还是容器

关于Promise的方法

关于Promise重要的有三个方法,Promise.all/Promise.allSettled/Promise.race这三个函数都是合并多个Promis,但是又有不同。

这三个函数都接受一个Promise数组,Promise.all/Promise.allSettled会在所有的Promise完成以后返回一个已完成的Promise数组。而Promise.race不同,他只会返回最先执行完成的Promise,当然剩下的异步操作亦不会被打断。这同时也是重要的一点异步操作不可打断

同时Promise.all/Promise.allSettled对执行失败的Promise的处理不同,前者是直接返回这个执行出错的Promise,期待你的后续处理。而后者是将错误的状态和原因一并返回。例如:

技术图片

可以看到,失败的Promise reject出来的值,作为了reason,也就是错误的原因。

关于Promise

标签:ima   异步   不可   函数的参数   是什么   同步   class   set   mamicode   

原文地址:https://www.cnblogs.com/freesfu/p/12926790.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!