当前位置: 首页 > 知识库问答 >
问题:

为什么回调在然后()是通过JS中的作业队列执行的

于嘉誉
2023-03-14

我是JS的新手,正在学习promise。我面临的困惑是,then()中的回调被推送到作业队列中。以下是一个例子:

 let promise = new Promise((resolve, reject) => {
       resolve(setTimeout(()=>console.log('Done'),2000))
    })
    .then((data) => {           
      data;
    })

所以,我们有promise,这是通过console.log('Done')解决的。之后,console.log('Done')被传递给then(),then()中的回调被传递给作业队列。为什么?在从asynchronous setTimeout获得数据之后,为什么需要将callback in then()传递给作业队列?

编辑

假设我们有以下代码

let promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('foo');
    }, 2000);
})
.then((data) => {
    console.log(`resolved value: ${data}`);
    return 'bar';
})

上面的代码是这样工作的吗?首先,当代码被执行时,JS引擎会在里面遇到promise和setTimeout。然后,setTimeout被推送到Web Api,然后JS引擎继续执行代码,然后遇到它的回调。然后,回调被推入作业队列,并等待直到promise得到解决。那是正确的吗?

共有2个答案

韩瀚
2023-03-14

promise被定义为具有作为属性值的函数的对象,然后:

然后(fulfilledHandler、errorHandler、progressHandler)

此函数应返回一个新的promise,该promise在给定的fulfilledHandler或errorHandler回调完成时实现。这允许promise操作链接在一起。回调处理程序返回的值是返回的promise的实现值。如果回调抛出错误,则返回的promise将移至失败状态。

换句话说,then不是附加回调的机制;这是一种将转换应用于promise并从转换中产生新promise的机制。

侯博易
2023-03-14

我不确定这个代码的行为和你想象的一样。

let promise = new Promise((resolve, reject) => {
    resolve(setTimeout(()=>console.log('Done'),2000))
})
.then((data) => {
    data;
})

这个promise是立即解决与setTimeout调用的结果。这可以通过添加日志到您的然后回调来演示:

.then((data) => {
    console.log('data', data);
    data;
})

此示例可能有助于:

let promise = new Promise((resolve, reject) => {
    console.log('one');
    setTimeout(() => {
        console.log('three');
        resolve('foo');
        console.log('four');
    }, 2000);
    console.log('two');
})
.then((data) => {
    console.log(`resolved value: ${data}`);
    return 'bar';
})

promise.then(data => console.log(`resolved value: ${data}`));
 类似资料:
  • 我正在使用parallelStream并行上传一些文件,有些是大文件,有些是小文件。我注意到并不是所有的工人都被使用。 一开始一切都运行良好,所有线程都被使用(我将并行选项设置为16)。然后在某一点上(一旦它到达更大的文件),它只使用一个线程 简化代码: uploaderPool是一个ArrayBlockingQueue。日志: 似乎所有的工作(列表中的项目)都分布在16个线程中,委托给一个线程的

  • 问题内容: 在 pipe 上使用2个 队列 在进程之间进行通信有什么优势(如果有)? 我正在计划使用python模块。 问题答案: 最大的好处是队列是进程和线程安全的。管道不是:如果两个不同的进程试图读取或写入pipe的同一端,则会发生不良情况。队列的抽象级别也比管道更高,这在您的特定情况下可能有优势,也可能没有优势。

  • 队列,和 栈一样,也是一种对数据的"存"和"取"有严格要求的 线性存储结构。 与栈结构不同的是, 队列的两端都"开口",要求数据只能从一端进,从另一端出,如图 1 所示: 图 1 队列存储结构 通常,称进数据的一端为 "队尾",出数据的一端为 "队头",数据元素进队列的过程称为 "入队",出队列的过程称为 "出队"。 不仅如此, 队列中数据的进出要遵循 "先进先出" 的原则,即最先进队列的数据元素

  • 问题内容: 我已经阅读了回调的Wikipedia定义,但仍然不明白。谁能解释一下回调是什么,尤其是以下几行 在计算机编程中,回调是对可执行代码或一段可执行代码的引用,该代码作为参数传递给其他代码。这允许较低层的软件层调用较高层中定义的子例程(或函数)。 问题答案: 也许一个例子会有所帮助。 您的应用程序想要从一台远程计算机下载文件,然后写入本地磁盘。远程计算机是拨号调制解调器和卫星链路的另一侧。延

  • 问题内容: 我想了解回调的概念。我在互联网上搜索了有关回调的信息,有很多使用接口的示例,一个类正在使用该接口调用另一类的方法。但是我仍然不能理解回调的主要概念,使用回调的目的是什么? 问题答案: 回调的概念是在另一个类中完成某些工作时通知类同步/异步。有人称其为好莱坞原则:“不要叫我们,我们叫你”。 这是一个例子: A类调用B类以在线程中完成一些工作。如果线程完成了工作,它将通过回调通知Class