最近,我看到了在 AngularJS 和 JQuery 中实现 Promises 的概念。
我已经在下面的代码中看到了 Java 中 Futures 的实现,但是这需要线程池的概念出现在语言/平台中。但是,Javascript 中没有这样的线程概念。那么 Javascript 中的 Promises 是如何实现的?
public class Futures1 {
private static final ExecutorService pool = Executors
.newFixedThreadPool(10);
public static void main(String[] args) {
Future<String> contentsFuture = null;
try {
contentsFuture = startDownloading(new URL("http://www.example.com"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
// other computation
try {
final String contents = contentsFuture.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
public static Future<String> startDownloading(final URL url) {
return pool.submit(new Callable<String>() {
@Override
public String call() throws Exception {
try (InputStream input = url.openStream()) {
return IOUtils.toString(input, StandardCharsets.UTF_8);
}
}
});
}
}
最佳答案
Promises 的发明是为了帮助管理异步操作。 Promises 本身不需要线程来做到这一点。它们是本质上为异步操作提供簿记的对象——为状态转换保留状态标志、结果值和监听器。这些都是可以使用常规单线程 Javascript 轻松完成的事情。
因此,只要您有异步操作(无论这些操作是如何实现的),您就可以从 promises 中受益,并且不需要线程来实现它们。
您在 Java 代码中看到的代码有助于在单独的线程中运行常规任务(为同步操作提供一些异步类型的行为)。这不是 promise 的作用。因此,如果您的环境中已有异步操作,则无需此类代码即可使用 Promise。
Javascript 中的异步事物的示例几乎是您感兴趣的任何事物,实际事件会在未来某个时间发生,并且其他代码可以在该事件触发之前运行。在浏览器的 Javascript 环境中,这包括 setTimeout()
、键盘事件、鼠标事件、ajax 完成回调等……这些都是异步事件。您对它们感兴趣(通过注册事件监听器或将回调传递给某个函数)。在 Javascript 实现的内部,可能有线程使这些异步事件起作用,但这些线程不需要直接暴露给程序员就可以实现异步功能。例如,参见 this post了解 Javascript 如何在其他 Javascript 事物运行时设法在后台运行 ajax 调用。您只需要知道您的回调函数将在未来某个不确定的时间被调用。
因此,在 Javascript 中,promises 用于管理您的环境中已经存在的异步操作。它们不用于使非异步事物变为异步(您需要线程才能做到这一点)。
请记住,promises 本身只是监控工具,用于监控现有的异步操作。 Promise 本身实际上并不是异步的,除了 .then()
可以使用内置 API 实现,例如 setTimeout()
或 setImmediate()
或 nextTick()
。 Promises 不需要它们自己的 native 代码或线程。事实上,如果需要,您可以使用普通的单线程 Javascript 编写 promise 实现。
关于javascript - 在没有线程的情况下如何在 Javascript 中实现 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25082867/