【发布时间】:2016-05-14 07:36:17
【问题描述】:
我需要以同步方式获取 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
}
);
谁能告诉我是否可以通过异步编程解决这个问题?
不管我的具体问题可以用异步代码解决,有一种方法可以以同步方式获取 Promise 的值(我知道它会阻止执行和所有性能问题,请避免 "bla bla...").
【问题讨论】:
-
我认为您对这些概念感到困惑。承诺是必要的,因为代码是异步的。如果可以同步完成,就不需要 Promises 开始了。如果这是在 NodeJS 中,它们确实有许多方法的同步版本,但如果你不可用,那么答案是“不”。
-
承诺在异步世界中有效。一旦某些东西被异步触发,就无法让它再次同步。
-
@squint 正如我所说,我正在处理两个不同的 API,所以我无法改变一个使用 promise 而另一个不使用的事实。你能看到示例代码并告诉我如何解决这个问题吗?
-
@edwin-dalorzo:说“没有办法……”和“在Javascript中没有办法”是不一样的,要求很简单可以在许多平台上完成,例如我提供的 Java 示例。您是在告诉我,在 Javascript 中,或者更具体地说,使用标准 Promise 对象无法完成?
-
@amit: 类似但不重复,可能是关于 Promise 对象的具体问题,而不是像 jQuery 或其他 API 使用的任何其他异步方法,即使我提供了一个代码示例,其中存在不同的问题另一个问题,所以我认为没有必要关闭或修改问题。如果您同意,您可以取消将问题标记为重复吗?
标签: javascript node.js promise