javascript - 在没有线程的情况下如何在 Javascript 中实现 Promise

标签 javascript promise

最近,我看到了在 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/

相关文章:

javascript - 在 Node.js 中使用 ES6 Promise 返回空响应

javascript - howler.js 更新声音的音量

javascript - JQuery 显示来自可见 HTML 表格单元格的文本的串联列表

reactjs - react hooks setState完成后如何解决promise?

node.js - 为什么结果不是我在 Nodejs promise 中所期望的?

javascript - Bluebird Promise.all 回调错误

javascript - 正则表达式:方括号之间的有限符号

javascript - Service Worker 和页面性能

javascript - 如何使用ajax上传文件?

javascript - 遍历 Q 中的 promise