Promise.reject 返回一个状态为已拒绝的 Promise 对象,并将给定的失败信息传递给对应的处理函数。 在上面的示例中, 仅在现有设置对象被追踪时才会被更新。 这是因为在不追踪的情况下,我们可能会使用错误的环境发送消息。 备注: 如果一个 promise 已经被兑现或被拒绝,那么我们也可以说它处于 已敲定(settled) 状态。
一个 Promise 对象代表一个在这个 promise 被创建出来时不一定已知值的代理。 它让你能够把异步操作最终的成功返回值或者失败原因和相应的处理程序关联起来。 这样使得异步方法可以像同步方法那样返回值:异步方法并不会立即返回最终的值,而是会返回一个 promise,以便在未来某个时候把值交给使用者。 这些函数的终止状态决定着链式调用中下一个 promise 的“已敲定”状态是什么。
promise: promise | American Dictionary
链式调用中的第一个 promise 是嵌套最深的一个,也将是第一个被弹出的。 混合古代 Callback 和 Promise 是有問題的。 如果 saySomething 失敗或有程式錯誤,那不會有任何錯誤被捕捉。 Promise 藉由捕捉所有錯誤,包含例外和程式錯誤,解決了 Callback 地獄的缺點。 基本上,一個 Promise 是一個根據附加給他的 Callback 回傳的物件,以取代傳遞 Callback 到這個函數。
对现有设置对象的追踪保证了浏览器知道用户给定的哪些代码片段需要使用。 一个已经处于“已敲定”状态的 promise 也可以接收操作。 在那种情况下,(如果没有问题的话)这个操作会被作为第一个异步操作被执行。 因此,一个已经处于“已敲定”状态的 promise 中的操作只有 promise 链式调用的栈被清空且一个时间片段过去之后才会被执行。
promise: Promise 的链式调用
要理解这一点,首先滚动到代码块的底部,然后查看 promise 调用链。 在创建初始的 primise 后,可以接上一条 promise 调用链。 该调用链由 .then() 组成,通常(但不一定)在末尾会有一个 .catch(),并可能会接上一个 .finnaly()。 在本示例中,promise 调用链是由一个自定义的 new Promise() 构造并发起的;但在实践中,promise 调用链通常由一个 API 函数(由其他人编写的)返回的 promise 开始。 设置对象(settings object)是 JavaScript 代码运行时用于提供附加信息的环境。 它包含了领域(realm)和模块映射(module map),以及 HTML 的特定信息,如来源(origin)等。
另一个使用 Promise 和 XMLHttpRequest 加载一个图像的例子可在 MDN GitHub js-examples 仓库中找到。 每一步都有注释可以让你详细的了解 Promise 和 XHR 架构。 如果所有的 promise 都成功了,它会把一个包含 iterable 里所有 promise 返回值的数组作为成功回调的返回值。
promise: promise
如果 promise 在一个相应的处理程序被绑定时就已经被兑现或被拒绝了,那么这个处理程序也同样会被调用,因此在完成异步操作和绑定处理方法之间不存在竞态条件。 为了更好地说明这一点,我们在这里进一步探讨领域是如何引发问题的。 其独特之处在于,它拥有运行 JavaScript 代码所需的所有信息。 每一个设置对象都有自己的“副本”,而且它们与副本之间是不共享的。 这可能会导致一些与 promise 相关的意外行为。 为了解决这个问题,我们需要追踪现有设置对象(incumbent settings object)。
你还会听到一个经常跟 promise 一起使用的术语:已决议(resolved),它表示 promise 已经处于已敲定状态,或者为了匹配另一个 promise 的状态被“锁定”了。 Domenic Denicola 的 States and fates 中有更多关于 promise 术语的细节可以供你参考。 基本上,Promise 建構子需要一個運作函數來正規地處理或拒絕 Promise。 但因為 setTimeout 不會失敗,所以我們捨棄 reject。 使用 Promise 构造函数来创建 promise。
过早地处理变为已拒绝状态的 promise 会对之后 promise 的链式调用造成影响。 不过有时候我们因为需要马上处理一个错误也只能这样做。 例如,外面必须抛出某种类型的错误以在链式调用中传递错误状态。 另一方面,在没有迫切需要的情况下,可以在最后一个 .catch() 语句时再进行错误处理,这种做法更加简单。 待定状态的 Promise 对象要么会通过一个值被兑现,要么会通过一个原因(错误)被拒绝。 当这些情况之一发生时,我们用 promise 的 then 方法排列起来的相关处理程序就会被调用。
当 .then() 中缺少能够返回 promise 对象的函数时,链式调用就直接继续进行下一环操作。 因此,链式调用可以在最后一个 .catch() 之前把所有的处理已拒绝状态的回调函数都省略掉。 Promise 是一個表示非同步運算的最終完成或失敗的物件。 由於多數人使用預建立的 Promise,這個導覽會先講解回傳 Promise 的使用方式,之後再介紹如何建立。 Promise 的值的兑现过程都被日志记录(logged,使用 p1.then())下来。 这些日志信息展示了方法中的同步代码和异步代码是如何通过 promise 完成解耦的。
“已决议”状态意味着 promise 已经成功完成,而“已拒绝”则表示 promise 未成功完成。 “已决议”状态的返回值会逐级传递到下一个 .then() 中,而“已拒绝”的理由则会被传递到链中的下一个已拒绝状态的处理函数。 此示例展示了使用 promise 的多种方法,以及其可能发生的多种情况。
- 请注意,函数 troubleWithGetNumber() 以 throw() 结束。
- 这是因为在不追踪的情况下,我们可能会使用错误的环境发送消息。
- 这是强制的做法,因为 ES6 的 promsie 会遍历所有的 .then promise,在遇到错误时,如果不使用 throw(),这个错误会被当作“已修复”。
- Domenic Denicola 的 States and fates 中有更多关于 promise 术语的细节可以供你参考。
- 由於多數人使用預建立的 Promise,這個導覽會先講解回傳 Promise 的使用方式,之後再介紹如何建立。
- Promise.resolve 返回一个状态由给定 value 决定的 Promise 对象。
由香港SEO公司 Featured 提供SEO服務