Rah*_*edi 6 javascript promise
所以我在MDN上读了一篇关于 Promise 的文章,结果被困在这里:
与 Promise.resolve() 不同,Promise.reject() 始终将 Reason 包装在新的 Promise 对象中,即使 Reason 已经是 Promise 时也是如此。
我只是想了解它在编码方面有何不同。如果不像那样用另一个 PromiseReject包装会发生什么,以及这到底如何简化使用。reasonresolve
欣赏一些假设的例子。
除了设计A+规格的人之外,我们无法谈论设计理念。但至于实际例子...
Promise 在快乐路径上自动变平:Promise.resolve(Promise.resolve(5));只是一个 5 的 Promise,而不是 5 的 Promise 的 Promise。
但Promise.reject不会自动展平,Promise.reject(Promise.resolve(5))实际上是一个(被拒绝的)Promise 5 的 Promise:
Promise.reject(Promise.resolve(5))
.catch(p => console.log(Object.prototype.toString.call(p)))
Run Code Online (Sandbox Code Playgroud)
将记录[object Promise].
旁注:在 2013 年提出提案时,Promises 在快乐路径上进行自动展平行为的决定是有争议的,许多人认为并且仍然认为 Promises 出于各种原因不应该这样做,你可以阅读有关详细信息,请链接 Github 讨论。如果您想了解非自动扁平化的 Futures API 是什么样子,请查看此内容。
如果 Reject 不像 resolve 那样用另一个 Promise 包装原因,会发生什么
Promise 会自动展平,您只会得到拒绝值 5,而不是 Promise 值 5。
这可能是一件很简单的琐事,但是 JS 社区有一个严格的约定,即不要拒绝没有错误的 Promise(就像其他 Promise 一样)。我似乎记得一些关于 React.js 拒绝带有非错误的 Promise 的争议,但我在追踪引用时遇到了一些麻烦。
无论如何,很多代码(或异步 try/catch 块.catch中的代码)隐式地假设捕获的值是一个错误,并且会执行诸如尝试解构一个在运行时抛出的属性之类的事情(这就是为什么 Typescript 会这样做)不要让你在没有强制转换或运行时检查的情况下这样做),所以在你决定需要拒绝一些不是错误实例的东西之前,请仔细考虑。catchmessage