首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JavaScript 异步编程指南 — Give me a Promise

Promise 状态流转 一个 Promise 在被创建出来时是一个等待态,最后要么成功、要么失败这个状态是不能够逆转的: 等待态(Pending) 执行态(Fulfilled) 拒绝态(Rejected...Promise 实例提供了两种错误捕获的方式:一是 Promise.then() 方法传入第二个参数,另一种是 Promise 实例的 catch() 方法。...err: There's a then mistake Promise 几个方法 Promise.all() 并行执行 Promise.all() 以数组的形式接收多个 Promise 实例,内部好比一个...for 循环执行传入的多个 Promise 实例,所有结果都成功之后返回结果,执行过程中一旦其中某个 Promise 实例发生 reject 就会触发 Promise.all() 的 catch()...好比我们的程序,创建了一个 Promise 对象 promise,并为其注册了完成和拒绝的处理函数,因为一些原因,我们没有给予它 resolve/reject,这个时候 promise 对象将会一直处于

1.2K10
您找到你想要的搜索结果了吗?
是的
没有找到

ES2017 异步函数的最佳实践(`async` `await`)

同时,async函数返回的promise会转换为“已拒绝”状态,在该状态下,我们应该在Promise#catch处理程序中处理错误-前提是该错误尚未被内部try/catch块捕获。... async 函数拒绝的,并且被用来作为回调,而不是像当作一般promise 来看待(因为 promise 是异步的,不能被当作一般的回调函数,译者注),就会发生这种情况。...异步事件处理程序被拒绝时, event emitter 将捕获未处理的拒绝并将其转发给错误事件。... promise 被拒绝时,Promise#catch处理程序将返回带有拒绝值的错误事件。...; }) .on('error', console.error) // This will be invoked. .emit('event'); async map 函数混合使用时,诸如

1.7K30

记得有一次面试被虐的题,Promise 完整指南

Resolve:是在异步操作完成时应调用的回调。 Reject:是发生错误时要调用的回调函数。 构造函数立即返回一个对象,即 Promise 实例。...还是输出: time is up ⏰ 是后者,因为一个Promise resolved 后,它就不能再被rejected。...如果没有出错,则永远不会调用catch方法。 假设我们有以下承诺:1秒后解析或拒绝并打印出它们的字母。...当然,这种过早的捕获错误是不太好的,因为容易在调试过程中忽略一些潜在的问题。 Promise finally finally方法只在 Promise 状态是 settled 时才会调用。...我们可以使用Promise.all,它通常在启动多个异步任务并发运行并为其结果创建承诺之后使用,以便人们可以等待所有任务完成。

2.3K20

JavaScript基础——Promise使用指南

在上篇文章里《JavaScript基础——回调(callback)是什么》我们一起学习了回调,明白了回调就是一个在另外一个函数执行完后要执行的函数,如果我们希望异步函数能够像同步函数那样顺序执行,只能嵌套使用回调函数...Rejected(已拒绝):如果Promise调用过程中遭到拒绝或者发生异常,那么我们的promise被拒绝,处于Rejected(状态)。...catch()方法只接收一个回调函数。catch()方法的onRejected回调的调用方式then()方法的onRejected回调相同。...was successful') }, failData => { console.log('Request failed' + failData) } ) 我们还可以使用catch()方法进行捕获异常或拒绝...(iterable) 方法 该方法传入迭代的Promise数组对象,并一起返回一个Promise对象,所有的Promise迭代对象成功返回后,整个Promise才能返回成功状态的值。

94830

JavaScript 编程精解 中文第三版 十一、异步编程

在本章中,我们将为他们编写一些基本的网络函数。 回调 异步编程的一种方法是使执行慢动作的函数接受额外的参数,即回调函数。动作开始,它结束时,使用结果调用回调函数。...这种回调函数必须始终检查它们是否收到异常,并确保它们引起的任何问题,包括它们调用函数所抛出的异常,都会被捕获并提供给正确的函数。 Promise使这更容易。...一个处理器抛出一个异常时,这会自动使then调用产生的Promise被拒绝。因此,如果异步操作链中的任何元素失败,则整个链的结果被标记为拒绝,并且不会调用失败位置之后的任何常规处理器。...就像环境处理未捕获的异常一样,JavaScript 环境可以检测未处理Promise拒绝的时候,并将其报告为错误。...它在调用时会产生一个Promise,它返回(完成)时被解析,并在抛出异常时被拒绝

2.6K20

JavaScript中的Promises

它们是否和你以任何方式对另一个人做出的承诺有关呢? 此外,你为什么要使用promises呢?传统的JavaScript操作回调(callbacks)相比,它们有什么好处呢?...打印jeffBuysCake表明承诺正在等待中。 当我们稍后一起构建jeffBuysCake时,你将能够自己证明此console.log语句。 在Jeff交谈之后,你开始计划下一步。...一个承诺得到实现时,你会在.then调用中做下一件事情: jeffBuysCake('black forest') .then(partyAsPlanned) // Woohoo!...如果发生这种情况,我们会说承诺拒绝(rejected)了。 承诺拒绝了,你可以在.catch调用中执行应急计划。...promise拒绝时,我们处理错误: getSomethingWithPromise() .then(data => {/* do something with data */}) .catch

78620

【译】JavaScript中的Promises

它们是否和你以任何方式对另一个人做出的承诺有关呢? 此外,你为什么要使用promises呢?传统的JavaScript操作回调(callbacks)相比,它们有什么好处呢?...image.png 打印jeffBuysCake表明承诺正在等待中。 当我们稍后一起构建jeffBuysCake时,你将能够自己证明此console.log语句。...一个承诺得到实现时,你会在.then调用中做下一件事情: jeffBuysCake('black forest') .then(partyAsPlanned) // Woohoo! ???...如果发生这种情况,我们会说承诺拒绝(rejected)了。 承诺拒绝了,你可以在.catch调用中执行应急计划。...promise拒绝时,我们处理错误: getSomethingWithPromise() .then(data => {/* do something with data */}) .catch

1.4K20

JavaScript Promise (期约)

# 链式流 可以把多个 Promise 连接到一起以表示一系列异步步骤。...# 处理未捕获的情况 有些 Promise 库增加了一些方法,用于注册一个类似于“全局未处理拒绝”处理函数的东西,这样就不会抛出全局错误,而是调用这个函数。...如果 Promise 被拒绝,而在定时器触发之前都没有错误处理函数被注册,那它就会假定你不会注册处理函数,进而就是未被捕获错误。...它的处理方式类似于你可能对未捕获错误通常期望的处理方式:done() 拒绝处理函数内部的任何异常都会被作为一个全局未处理错误抛出(基本上是在开发者终端上)。...永远要记住为每个 promise 关联一个拒绝 / 错误处理函数,特别是从 Promise.all([]) 返回的那一个。

44830

「一次写过瘾」手写Promise全家桶+Generator+asyncawait

3.x 是对象或函数 取出 x.then 并调用调用时将 this 指向 x。将 then 回调函数中得到的结果 y 传入新的 Promise 解决过程中,递归调用。...同时需要注意,Promise 内部的异常不能直接抛出,需要进行异常捕获。...取出 x.then 并调用调用时将 this 指向 x,将 then 回调函数中得到的结果 y 传入新的 Promise 解决过程中,递归调用。...(这个错误不能通过try/catch捕获,只能通过拒绝处理程序捕获) Promise.reject = function(reason) { return new Promise(function...手写 async/await Generator 缺陷: 1.函数外部无法捕获异常 2.多个 yield 会导致调试困难 async 函数对 Generator 函数改进如下: 1.内置执行器 2.更好的语义

94320

JavaScript 权威指南第七版(GPT 重译)(五)

同样,迭代器解构赋值一起使用时,next()方法只会被调用足够次数以获取每个指定变量的值。迭代器可能有更多值可以返回,但它们永远不会被请求。...调用者可以在这个承诺对象上注册一个或多个回调,异步计算完成时,它们将被调用。 因此,在最简单的层面上,承诺只是一种回调一起工作的不同方式。然而,使用它们有实际的好处。...但我们不能使用承诺来替代setInterval(),因为该函数会重复调用回调函数,而这是承诺设计上不支持的。...虽然理解 Promises 如何工作仍然很重要,但 async 和 await 一起使用时,它们的复杂性(有时甚至是它们的存在本身!)会消失。...TypeError: 我们不能调用这个函数 注意,除了演示可撤销代理之外,上述代码还演示了代理可以目标函数以及目标对象一起使用。

17510

JavaScript 错误处理大全【建议收藏】

AggregateError 可以把多个错误很方便地包装在一起,在后面将会看到。 除了这些内置错误外,在浏览器中还可以找到: DOMException DOMError 已弃用,目前不再使用。...如果异常是未捕获的,也就是说程序员没有采取任何措施来捕获它,则程序将会崩溃。 你在什么时候及在什么地方捕获代码中的异常取决于特定的用例。 例如,你可能想要在栈中传播异常,使程序完全崩溃。...] 如果这些 Promise 中的任何一个被拒绝Promise.all 都会拒绝,并返回第一个被拒绝的 Promise 中的错误。...这个静态方法没有什么要处理的,因为**即使一个或多个输入 Promise 被拒绝,结果也始终是一个已解决的Promise **。...它们将生成器函数 async 结合在一起。其结果是生成器函数将 Promise 暴露给使用者的迭代器对象。 我们用前缀为 async 和星号 * 声明一个异步生成器函数

6.3K50

关于 JavaScript 中的 Promise

一个待定的 Promise 最终状态可以是已兑现并返回一个值,或者是已拒绝并返回一个原因(错误)。其中任意一种情况发生时,通过 Promise 的 then 方法串联的处理程序将被调用。...,使得调用 fetchData 的代码可以捕获并处理错误 });}// 使用fetchData函数获取数据fetchData() .then(data => { //...在调用 fetchData() 函数的代码中,可以使用 .then() 方法来处理成功获取数据后的进一步操作,并使用 .catch() 方法来捕获可能的错误。...通过链式调用 .then() 方法,代码更加清晰、易读。更好的错误处理机制: Promise 具有 .catch() 方法,可以捕获 Promise 链中任何地方发生的错误。...这使得错误处理更加集中和可控,而不必在每个异步操作中都编写独立的错误处理逻辑。避免回调嵌套: 使用 Promise 可以避免回调函数的嵌套问题,使代码更具可维护性。

54863

通俗的解释什么是Promise

): 就说这个事情交给我吧,我承诺我去买菜,买完回来马上给你做红烧排骨,做完马上就叫你吃(这个地方相当于promise链式调用),你现在该干嘛干嘛去,去刷抖音,打游戏都可以(不影响其他代码的调用)。...Promise状态为fulfilled时,调用 then 的 onfulfilled 方法,Promise状态为rejected时,调用 then 的 onrejected 方法, 所以在异步操作的完成和绑定处理方法之间不存在竞争...catch 方法执行过程出现异常时执行,或Promise的状态被设为失败(rejected),并且没有设置rejected执行函数时也会执行。...另外catch无法捕获在异步方法里抛出的异常 finally 方法由于无法知道promise的最终状态,所以finally的回调函数中不接收任何参数,它仅用于无论最终结果如何都要执行的情况。...但是这里有一点要注意下:如果调用链中有一个出现异常或者状态被改为拒绝,那么调用链中剩下的就不会被执行。所以在使用链式调用时要慎重!

86220

使用图解和例子解释Await和Async

更确切地说,任何承诺之后的代码都是Promise同时运行的。 在Promise完成之前,我们没有任何合理的理由阻止当前的操作顺序。...调用“线程”不能等待Promise。 在Promise之后执行代码的唯一方法是通过then方法指定回调函数。 只有当Promise成功时,回调函数才能执行。...这两个Promise同时运行,我们需要安排一个回调,在它们都完成时调用。 因此,我们需要通过Promise.all(第11行)将它们组合成一个单一的Promise,它们完成时,它们就可以正确调用。...这种方法可以很容易地改写成用Promise.all多个then连接起来的链式面条代码。...catch(err => console.log(err)) 这通过已知的异常处理机制使我们方便地处理被拒绝的Promise。 讨论 Async/await是一种对Promise的语言上的补充。

1.4K20
领券