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



我是JS的新手,正在学习Promises。我面临的困惑是,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(((中的回调被传递给作业队列。为什么?在我们得到异步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被推送到WebApi中,然后JS引擎继续执行代码,并遇到Then及其回调。然后将回调推送到作业队列中,等待promise得到解决。这是正确的吗?

我不确定这段代码的行为是否像你想象的那样。

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

承诺被定义为一个对象,该对象具有函数作为属性值,然后:

然后(fulfiledHandler、errorHandler、progressHandler(

当给定的fulfiledHandler或errorHandler回调已完成。这允许promise操作链接在一起。返回的值来自回调处理程序的是返回的许诺如果回调抛出错误,则返回的promise将为已移动到失败状态。

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

最新更新