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

时间:2019-11-16 05:40:15

标签: javascript promise

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

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

因此,我们保证可以通过console.log('Done')解决。之后,将console.log('Done')传递给then(),然后将then()中的回调传递给作业队列。为什么?在从异步setTimeout获得数据后,为什么需要将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引擎继续执行代码,然后遇到其回调。然后,回调将被推送到作业队列中,并等待直到承诺被解决。那是对的吗?

2 个答案:

答案 0 :(得分:1)

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

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

此承诺正在通过setTimeout调用的结果立即解决。可以通过在您的then回调中添加日志来证明这一点:

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

答案 1 :(得分:0)

一个诺言被定义为对象,该对象具有该属性的值,然后:

然后(fulfilledHandler,errorHandler,progressHandler)

  

此函数应返回一个新的诺言,当   给定的fulfilledHandler或errorHandler回调已完成。这个   允许将诺言操作链接在一起。返回值   来自回调处理程序的是返回值的实现值   诺言。如果回调引发错误,则返回的promise将为   移到失败状态。

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