承诺构造函数是必要的还是可以避免的?

时间:2017-10-12 18:03:33

标签: javascript promise es6-promise

根据Promise - Javascript | MDN

  

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

  1. 在较低级别,已支持promises的函数会 这样做是正确的,即使用promise构建Promise并将其返回?
  2. 除了使用promise构造函数之外,还有更好的方法来创建Promise吗?
  3. 最后,您必须在某处注册callback吗?我的意思是你不能避免callback至少resolves?换句话说,我们必须在库中的某处将它包装成正确的吗?

3 个答案:

答案 0 :(得分:1)

  

在较低的层次上,已经支持promises的函数就是这样做的,即使用Promise构建一个promise并将其返回?

是。也许。在较低的层面上,我们不知道已经支持承诺的函数如何构建它们。想象一下Promise构造函数本身用于构造promise的内容......

  

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

不,JS无法访问其他方式。但正如MDN所指出的那样,你自己应该很少需要自己做,而只是使用已经为你创建承诺的其他函数(当然它们本身会以某种方式通过Promise构造函数)。

  

最终,您必须在某处注册回调吗?我的意思是你不能避免回调至少解决?

不一定。在较低级别,您还可以注册任何允许解析承诺的任意数据结构,这不一定需要是回调函数。 (但是,它确实等同于注册resolve回调函数)。

例如fetch API的本机实现(afaik直接返回promises的第一个本机API)很难在任何地方创建JS回调函数来解决它的承诺。

答案 1 :(得分:1)

  1. 在最低级别?是的,可能。
  2. 取决于具体情况。如果您要将值解析为的值已经可用,那么您将使用Promise.resolve(theValue)。如果您想等待多个承诺,请使用Promise.all(allThePromises)。当然,每次拨打.then都会收到新的承诺。
  3. 如果您想对承诺的价值做任何事情,那么是的,您必须将回调传递给.then没有其他方法可以获得价值。
  4. 说了这么多,ES2017 introduced async functions基本上是承诺的语法糖。 async函数总是返回一个promise,你可以使用await来解包promises。例如:

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

答案 2 :(得分:1)

  
      
  1. 在较低的层面上,已经支持承诺的功能就是这样做,即使用Promise构建一个承诺并将其返回?
  2.   

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

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

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

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

最明显的是,如果您使用已经返回承诺的API,则可以使用.then().catch()语法将承诺链接在一起。

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

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

  
      
  1. 最终,您必须在某处注册回叫吗?我的意思是你不能避免回调至少解决?换句话说,我们必须在库中的某处将它包装成正确的吗?
  2.   

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