我是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引擎继续执行代码,然后遇到其回调。然后,回调将被推送到作业队列中,并等待直到承诺被解决。那是对的吗?
答案 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将为 移到失败状态。
也就是说,这不是附加回调的机制。这是一种将转换应用于承诺并从该转换中产生新承诺的机制。