Promise 构造函数是必须的还是可以避免?

问题描述 投票:0回答:3

根据Promise - Javascript | MDN

构造函数主要用于包装不支持的函数 已经支持承诺了。

  1. 在低级别上,已经支持 Promise 的函数会正确执行此操作,即使用
    Promise
    构造 Promise 并将其返回?
  2. 除了使用
    Promise
    构造函数之外,还有更好的方法来创建 Promise 吗?
  3. 最终,您必须在某个地方注册回调,对吗?我的意思是你无法避免至少可以解决的回调?换句话说,我们必须像这样将它包装在库中的某个位置,对吗?
javascript promise es6-promise
3个回答
1
投票
  1. 处于最低水平?是的,可能是。
  2. 取决于上下文。如果您想要解析的值已经可用,那么您可以使用
    Promise.resolve(theValue)
    。如果你想等待多个 Promise,你可以使用
    Promise.all(allThePromises)
    。当然,每次调用
    .then
    都会返回一个新的承诺。
  3. 如果你想用 Promise 的值做任何事情,那么是的,你必须将回调传递给
    .then
    没有其他方法可以获取该值。

话虽如此,ES2017 引入了异步函数,它们基本上是 Promise 的语法糖。

async
函数始终返回一个 Promise,您可以使用
await
来解开 Promise。示例:

async function get() {
  return await Promise.resolve(42);
}

get().then(console.log);


1
投票
  1. 在低级别上,已经支持 Promise 的函数会正确执行此操作,即使用 Promise 构造 Promise 并将其返回?

最终的目标是,即使 Node.JS 中的低级 API 也将使用 Promise 语法,因此不需要回调。 PromiseJS 社区认为构造函数语法是这种最终行为的填充。 来源。

实际情况显然并非如此。浏览器、Node.JS 和其他 Javascript 运行时环境大量使用回调,因此使用 Promise 构造函数。

  1. 除了使用 Promise 构造函数之外,还有更好的方法来创建 Promise 吗?

是的 - 但这取决于应用程序。

最明显的是,如果您使用的 API 已返回 Promise,则可以使用

.then()
.catch()
语法将 Promise 链接在一起。

还有许多库扩展了默认的 Promise 功能,并提供了提高性能和可读性的便捷方法。例如,Bluebird(一个常见的 PromiseJS 库)提供了一种方法来评估同时创建的多个 Promise 的结果,以加快整体运行时间。

您还可以从其他范例构建 Promise,以简化代码 - 例如 Promise.Promisify 将回调函数转换为 Promise 函数,或者 Observable.toPromise 将 Observables 转换为 Promise。

  1. 最终,您必须在某个地方注册回调,对吧?我的意思是你无法避免至少可以解决的回调?换句话说,我们必须像这样将它包装在库中的某个位置,对吗?

与第一个问题的答案类似,这是当前使用回调范例的代码的症状。如果所有库都在较低级别上使用 Promise,情况就不会如此。


1
投票

在低级别上,已经支持 Promise 的函数会正确执行此操作,即使用 Promise 构造 Promise 并将其返回?

是的。或许。在较低的层面上,我们不知道已经支持 Promise 的函数是如何构造这些函数的。想象一下

Promise
构造函数本身使用什么来构造 Promise...

除了使用 Promise 构造函数之外,还有更好的方法来创建 Promise 吗?

不,JS 没有其他方法可以访问。但正如 MDN 所指出的,您应该很少需要自己执行此操作,而只需使用已经为您创建 Promise 的其他函数(它们本身当然会以某种方式通过 Promise 构造函数)。

最终,您必须在某个地方注册回调,对吗?我的意思是你无法避免至少可以解决的回调?

不一定。在较低级别,您还可以注册任何允许解析承诺的任意数据结构,这不一定需要是回调函数。 (然而,它的功能确实相当于注册

resolve
回调函数)。

例如,

fetch
API(据我所知是第一个直接返回 Promise 的原生 API)的本机实现几乎不会在任何地方创建 JS 回调函数来解析其 Promise。

© www.soinside.com 2019 - 2024. All rights reserved.