相关疑难解决方法(0)

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

最近,我已经看到Promise的概念在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()) …
Run Code Online (Sandbox Code Playgroud)

javascript jquery promise

36
推荐指数
2
解决办法
1万
查看次数

如何连接事件循环,回调队列和Javascript的单线程?

一般目标

我想知道以下javascript环境如何作为系统互连.

  • Javascript引擎
  • 事件循环
  • 事件队列

我们可以将此限制为浏览器环境,因为节点已在另一篇文章中介绍(此处)

我(相信)理解的事情:

  • Javascript是单线程的,因此只有一个callstack.

  • Javascript环境只提供一些真正异步的函数.这些可能包括setTimeout(),setInterval()和I/O函数.

  • 如果不使用其中一个,开发人员就无法创建自己的异步函数.
  • Javascript本身同步运行,但通过它的异步函数可以在当前的callstack清除后回调可能的阻塞函数.

例:

      console.log(‘Sync code started…’);

      setTimeout(function asyncLog() {
           console.log(‘Async function has completed’)
      }, 2000);

      console.log(‘Sync code finished…')
Run Code Online (Sandbox Code Playgroud)

示例步骤:

(如果我错了,请纠正步骤)

  1. 记录"同步代码已启动..."
  2. setTimeout被添加到堆栈但立即返回控件
  3. setTimeout被发送到另一个'thread'...'worker'?在javascript的单线程之外计算2000毫秒
  4. 记录"同步代码已完成..."
  5. 在2000毫秒之后,asyncLog()被推送到事件队列
  6. 由于callstack已清除,因此Event Loop会检查事件队列是否有待处理的回调
  7. asyncLog()从队列中删除,并由事件循环推送到堆栈
  8. 记录了"异步功能已完成"
  9. callstack现在很清楚了

质询

如果有人可以概述async函数(例如setTimeout)从第一次访问callstack到回调到callstack的时间和位置的步骤的概述,则不需要逐个回答这些步骤.

  1. 在第3步,谁产生这个新线程?是浏览器吗?
    • 这个新线程被阻止正确吗?
    • 如果你有一个创建1000 setTimeouts的循环会发生什么.是否创建了1000个"线程"?
    • 一次可以生成多少个线程是否有限制?
    • 当新线程完成执行时,它如何最终在队列中?
  2. 谁提供了事件队列?
  3. 谁提供事件循环?
    • 事件循环是否轮询事件队列?
    • javascript的线程是否知道事件循环?或者Event循环只是把东西推到堆栈上?
    • 事件循环如何知道堆栈何时清除?

javascript asynchronous event-loop event-queue single-threaded

20
推荐指数
1
解决办法
5742
查看次数

什么是异步javascript函数的简单示例?

我真的在努力学习编写异步JavaScript.能否请您提供一个简单的JavaScript函数示例,它是用纯JavaScript编写的异步(而不是使用Node.js或JQuery)

javascript asynchronous

18
推荐指数
3
解决办法
3万
查看次数

Javascript,回调函数什么时候进入事件队列?

真的很想了解javascript的事件队列。我目前的理解如下。

代码:

let doSomething = (callback) => {
callback("first");
};

let foo = (text) => {
    console.log(text);
};

doSomething(foo);

setTimeout(() => {
    console.log("hey");
});

console.log("after");
Run Code Online (Sandbox Code Playgroud)

目前的知识:

doSomething 的回调不是异步操作,因此不会放入回调队列中。然而,setTimeout 是一个异步操作,因此将 this 放入回调队列中。因为回调队列是在 JavaScript 线程结束后调用的,所以该setTimeout()函数是最后调用的。

问题:

  1. 我现在的理解正确吗?
  2. 究竟是什么使操作成为异步操作?这是因为 Javascript 本身有某些默认情况下是异步的操作吗?
  3. 您可以在 javascript 中自己进行异步操作,而不使用像 这样的内置异步操作吗setTimeout()

javascript asynchronous callback

4
推荐指数
1
解决办法
632
查看次数

是什么让 JavaScript 函数异步?

我的目标是了解某些 JavaScript 函数到底是什么使它们成为异步的。你可以有这样的函数:

function someRandomFunction () {
  for (let i of everything) {
    iterator++
    something = true
    hello = that + whatever
  }
}
Run Code Online (Sandbox Code Playgroud)

这个函数没有什么是异步的。它可以做很多事情,但是做起来非常快。

然后采用如下 Node.js 函数:

fs.readFile('path/to/file', (err, data) => {
  // do something
})
Run Code Online (Sandbox Code Playgroud)

该函数被声明为异步的。但为什么会这样呢?其背后的原因是什么?

是否因为读取文件需要一定的时间才能完成,因此它是异步的?为什么循环某些变量并进行某些计算不是异步时是异步的?

javascript asynchronous node.js

2
推荐指数
1
解决办法
435
查看次数