【发布时间】:2014-09-24 19:30:30
【问题描述】:
最近,我看到了 Promises 的概念在 AngularJS 和 JQuery 中实现。
我已经在 Java 中看到了 Futures 的实现,如下面的代码所示,但这需要在语言/平台中存在线程池的概念。但是,Javascript 中没有这样的线程概念。那么 Javascript 中的 Promise 是如何实现的呢?
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);
}
}
});
}
}
【问题讨论】:
-
不确定我是否明白这个问题,但 javascript 通常是单线程的,但某些本地方法除外,例如 ajax、webworkers、超时、websockets 以及包括 Promises 在内的越来越多的新方法。换句话说,native 方法不一定要遵守单线程的规则
-
Javascript 使用事件是非同步的——事件不需要线程,但可以轻松实现承诺。事件存在于单核 8088 中,当时被称为“硬件中断”
-
并发!=并行。就这么简单,代码是交错的。
-
这样想——promise 不提供异步,而是为处理其他方式提供的异步提供语法便利。
-
承诺是implemented in terms of callbacks。那么回调是如何异步的呢?好吧,that's a different question
标签: javascript promise