【Promise】

2022-12-30 0 732

chan时评jack.lin – chanchan时评

写诗

【Promise】

这是一则白痴都看不懂的Promises该文!

https://www.zhihu.com/people/rachel-46-59
【Promise】

Rachel · 3 年前

附注出自于scotch上Jecelyn Yeen的撷取哦。

该文目地多于两个:让他们更容易的介绍JavaScript Promises!

JavaScript Promises只不过无从。不过,许多人一开始就真的有点儿难认知.。因而我想用一类假定的形式写出我认知promise。

(一)认知promises

举个单纯范例:

想像你是两个小孩。你老婆允诺下礼拜 给你买个新智能手机。你 [不晓得] 你与否会获得智能手机直至下礼拜。你老婆能吗买你两个崭新的智能手机,也能让你hasbro并说你不买了(假如她不开心了)。

这是两个允诺。两个允诺有3个状况。依次是:

1.争论不休:你 [不晓得] 你与否会获得智能手机直至下礼拜。

2.化解:你老婆能吗买你两个崭新的智能手机。

3.婉拒:你老婆婉拒给你买,即使你惹她不开心。

(二)建立两个promise

咱们把上面的范例转换成JavaScript.

【Promise】

–> 代码表现力挺强的嘛!

“isMomHappy”是个布尔值,定义老婆与否开心。“willIGetNewPhone”是两个promise,这个允诺能化解(给你买),也能婉拒(老婆不开心就不给你买)。.还有两个标准语法去定义两个新的promise,参考MDN documentation,看下面代码:
【Promise】
需要记住的是,在你定义的promise里,当结果是成功的,叫 化解(你的成功值),假如结果失败了,叫 婉拒(你的失败值)。在他们的范例中,假如老妈开心,他们会获得两个电话。因而,他们称 resolvefunction(电话变量)。假如老婆不开心,他们称为 婉拒函数(婉拒的理由);

(三)玩转promises

现在有了promise,咱们就已经开始玩一玩。

【Promise】

他们有两个函数“askmom”。在这个函数中,他们将使用他们的允诺“ willigetnewphone”。

当他们的promise是化解或者婉拒的时候,他们要做点事儿,他们用“.then & .catch ”来处理他们的行动;在“.then”里面有函数“ function(fulfilled) { … } ”。这个函数的返回值是啥呢?返回值是promise化解的值(你的成功时候的值);在他们的案例中它是一部新电话 。在 “.catch”里面有函数”function(error){ … } “。猜测一下,只不过这个返回的是错误值,就是promise婉拒的值。

走一下案例看下结果!

【Promise】

(四)链接promises

Promises都是可链的。

这样说吧,你,咱范例中的小孩,允诺给你的朋友说:假如你老婆给你买了新智能手机,就让你的朋友过过眼瘾,你要显摆显摆!

这又是另外两个promise了,写成代码看下!

【Promise】

注意:

在这个范例中,你可能会意识到他们不叫 婉拒。即使它是可选的。

他们能缩短这个案例,看代码:
【Promise】

咱们现在链接promise。你,这个小孩只能在获得智能手机后才能显摆智能手机。

【Promise】

–> 单纯吧!

(五)promises都是异步的

Promises都是异步的,咱们在这个promise已经开始和结束前写一段信息。

【Promise】

期望输出的顺序是什么?也许你以为:

【Promise】

不过,实际的输出序列是:

【Promise】
【Promise】
为啥?即使生活就是不等人的,JavaScript也是!

你,小孩,不会说不去玩了就干等你老婆的允诺(新智能手机),对吧。这就是 异步调用,代码将无阻塞运行或等待结果。任何需要等promise的行为放在”.then”里面。

Promise在 ES5 /ES6 /ES7 下:

ES5 – 大多数的浏览器

ES5不支持promise,大多数浏览器借助第三方库(BluebirdQ)的话能实现;

ES6 – 现代浏览器

演示代码是ok的,即使ES6支持promise。此外,他们也能用ES6的箭头函数来简化代码。也能用上let和const。

下面是ES6的演示代码:

【Promise】

–> 注意到所有的 var 都被 const 取代。所有的函数(化解,婉拒) 都使用箭头函数简化。

ES7 – 异步等待使语法看起来更漂亮!

ES7介绍 异步 和 等待 语法。它使异步语法看起来更漂亮、更容易认知,没有 “.then” 和”.catch”。

用ES7语法来重写他们的范例:

【Promise】

当你需要在两个函数里面返回两个promise,你在异步 调用这个函数。例如 案例中的异步函数”function showOff(phone)”。当你需要两个promise,你就在等待着 。例如 “let phone = await willIGetNewPhone;” & ” let message = await showOff(phone)”。使用 ” try { … } catch(error) { … } ” 捕捉promise错误/婉拒 。

为什么使用promise?什么时候使用它们?

为什么他们需要promise?promise之前的世界是怎样的?在回答这些问题之前,让他们回到最基础的地方。

对比正常函数和异步函数

让他们来看看这两个范例,这两个范例执行两个数字相加:

正常函数两个数相加:

【Promise】

异步函数两个数相加:

【Promise】

假如你用正常的函数让两个数字,你会立即获得结果.。但是,当你发出远程调用来获得结果时,你需要等待,你不能立即获得结果.。

或者这样说,你不晓得你与否会获得结果,即使服务器可能会下降,响应速度慢等,你不希望在等待结果的时候,整个进程被阻止。调用API,下载文件,读取文件中的一些你要执行的常用的异步操作。

Promises之前的世界:Callback回调

他们必须使用promise来实现异步调用吗?不是的,在promise之前,他们使用回调。回调函数只是你获得返回结果时调用的函数.。让他们使用回调修改前面的范例。

【Promise】

异步看起来ok,为啥还要用promise呢?

假如你想进行后续的异步操作怎么办?

三个数相加,正常函数这样写:

【Promise】

怎么看起来像回调?

【Promise】

语法对用户是友好的。有两个更好的术语,它看起来像两个金字塔,但人们通常把这称为“回调地狱”,即使回调嵌套到另两个回调。假定你有10的回调,你的代码将嵌套的10倍!

逃离回调地狱吧!

让promise来拯救。让他们来看看同样的范例的promise版本。

【Promise】

有了允诺,我们用”.then”扁平化回调。在某种程度上,即使没有回调嵌套,它看起来干净。当然,用ES7异步语法,能让他看起来更简洁!

新家伙:Observables观测值

在promise已经让你很幸福的时候,Observables这货来锦上添花,让处理异步数据量更容易。

Observables是懒惰的事件流,能发出零个或多个事件,而且可能完成也可能不完成。

promise和observable的关键区别是:

Observables观测值是能取消的Observable是懒惰的

不要害怕,让他们来看看Observables的案例。在这个范例中,关于Observables使用RxJS。

【Promise】

Observables观测值可以很容易的做一些时髦的东西。看案例:

【Promise】

好吧,咱们以后再接着讨论Observables观测值吧!

总结:

自己尝试介绍和使用callbacks 和 promises,目前还不用太担心Observables,但是这三者都会影响到你的发展哦。

T就这些了,希望这篇该文能帮你驯服JavaScript的promise!元旦快乐!

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务