以同步方式获取Javascript Promise的值

我需要以同步方式获得Javascript Promise对象的值。

我知道它是如何工作在Javascript中的Promise对象及其优点,以及如何使用then方法处理值,但是有用例,特别是Node.js(但也可以应用于浏览器引擎),在你需要的地方仅返回值,但是您调用的是返回Promise对象的API,而且不能更改该API的签名或使用者API。

例如,在Java语言中,您有get()方法,它允许您在必要时等待以完成操作(阻止执行),然后返回结果。 即使你有一个get(timeout,unit)的最大时间来等待,如果等待超时发射TimeoutException之前等待。

我遇到的问题是这样的:

 api1.setCallBackThatHasToReturnANoPromiseValue( function(p1, p2) { return api2.getPromisedValue(p1,p2) // This returns a Promise .get() // -> but something like this // could get the value in a sync way } ); 

有人可以告诉我,如果我可以用asynchronous编程解决这个问题吗?

不pipe我的具体问题可以用asynchronous代码解决,有一种方法可以同步的方式获得Promise的价值(我知道它会阻止执行和所有的性能问题,请避免“bla bla”。 ..“ )。

我需要以同步方式获取Javascript Promise对象的值。

你不能。 如果API返回一个承诺,那是因为该操作是asynchronous的。 当你的函数返回的时候,这个值还没有被知道,Javascript在返回之前没有提供任何等待结果的机制。

相反,你必须devise一个asynchronous响应,你的调用者必须编写一个asynchronous响应。 既然你已经使用了promise,这意味着你的调用者需要在promise上使用一个.then()处理程序来访问asynchronous结果,并且.then()处理程序在将来会被调用一段时间, API调用已经返回。

浏览器和node.js中的Javascript与Java有着根本的不同,这一点很重要。 这些Javascript环境是单线程和事件驱动的。 这意味着你不能阻止和等待返回之前发生的事情。 相反,您必须返回并让事件队列运行,以便最终可以处理asynchronous结果并触发callback。 如果你试图阻止并等待一个结果(有些人正在尝试做一些循环,只是循环几秒钟来模拟一个可能用在另一种语言中的sleep()调用),你会遇到死锁,因为结果可能会直到你停止阻塞才能被处理,但是在结果准备好之前你不会阻止阻塞。 你最终会陷入无限循环。

所以,相反,你必须学习如何在Javascript中编写asynchronous响应,或者通过一个简单的callback.then()或者使用promises和相关的.then()处理程序。 而且,asynchronous结果的所有消费者都必须知道它是asynchronous的,并相应地进行编程。


另外,承诺是未来价值的performance。 您只能通过.then()处理程序访问该处理程序,该处理程序在(准备就绪的时候)该值已准备就绪或发生错误时将被调用。 没有从承诺中获得价值的同步方式。

如果您可以使用ES2016(ES7)function(通过Babeljs或库),则可以使用asynchronous等待。

使用async-await将函数定义为具有asynchronous代码,然后使用await关键字等待来自asynchronous函数的响应。 asynchronous函数需要返回一个承诺。 Async-await允许您编写asynchronous代码,就好像它是同步代码一样。