Javascript 为什么在JS中通过作业队列执行then()内的回调

Javascript 为什么在JS中通过作业队列执行then()内的回调,javascript,promise,Javascript,Promise,我是JS的新手,正在学习承诺。我面临的困惑是,then()中的回调被推送到作业队列中。以下是一个例子: let promise = new Promise((resolve, reject) => { resolve(setTimeout(()=>console.log('Done'),2000)) }) .then((data) => { data; }) 所以,我们有承诺,这是通过console.l

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

 let promise = new Promise((resolve, reject) => {
       resolve(setTimeout(()=>console.log('Done'),2000))
    })
    .then((data) => {           
      data;
    })
所以,我们有承诺,这是通过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引擎继续执行代码并遇到Then及其回调。然后,将的回调推送到作业队列中,并等待承诺得到解决。对吗

我不确定这段代码是否符合您的想法

let promise = new Promise((resolve, reject) => {
    resolve(setTimeout(()=>console.log('Done'),2000))
})
.then((data) => {
    data;
})
这一承诺将随着通话结果立即得到解决。这可以通过在
回调中添加日志来演示:

.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}`));

承诺被定义为具有函数作为属性值的对象:

然后(fulfilledHandler、errorHandler、progressHandler)

此函数应返回一个新的承诺,当 给定的fulfilledHandler或errorHandler回调已完成。这 允许将承诺操作链接在一起。返回的值 来自回调处理程序的是返回的 答应我。如果回调抛出错误,则返回的承诺将被删除 已移动到失败状态


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

您试图实现什么?
setTimeout()
返回一个timerID,然后稍后执行其计时器回调。因此,这意味着您将立即解析承诺,并将timerID作为解析值,计时器回调将在2秒后调用。同时,由于承诺已被解析,因此将调用
.then()
处理程序。所有
.then()
处理程序在未来的一个刻度上执行,而不是同步执行。这就是承诺规范的编写方式。您的示例没有真正意义,因为超时与(立即的!)承诺解决方案无关。如果这只是一个错误,而你真的想问一个名义上的问题,请看@Bergi,您好,谢谢您的好意评论,我只是想了解一下为什么通过作业队列执行then()的回调。这样做的原因是回调可以是异步的,例如..then((数据)=>{return setTimeout(数据);})。如果是这样,那么如果我们不使用异步代码而只使用.then((data)=>{data;}),那么通过作业队列执行这个回调有什么意义,因为它只是synchronous@Dickens不知道,我认为这仍然是一个未解决的问题。随着时间的推移,建立一个个人信息来源信誉的衡量标准……像鼓掌/投票、评论,甚至拼写质量都可以作为指标。嘿,安迪,谢谢你友好的回答,我只是想了解为什么then()的回调被传递到工作队列中。从那时起()的回调只在我们从异步操作中获取数据之后执行。在获取数据后,我无法从逻辑上理解将then()的回调传递到作业队列的原因。请我确实需要您的帮助((我想第一个原因是它在规范中-。对我来说,这比更改当前调用堆栈更有意义,特别是因为我们只是传递一个函数,而不是调用它。回调也可能是异步的-在这种情况下立即执行有意义吗?
progressHandler
?你在哪里你从哪里得到的?