我的时区下午好。
我一直在阅读Promises和Async函数,我遇到了一个代码示例的页面:
function doubleAfter2Seconds(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x * 2);
}, 2000);
});
}
async function addAsync(x) {
const a = await doubleAfter2Seconds(10);
const b = await doubleAfter2Seconds(20);
const c = await doubleAfter2Seconds(30);
return x + a + b + c;
}
var toLog = addAsync(10);
console.log(toLog);
我使用了JSFiddle和Chrome控制台: " toLog" variable是promiseValue为130的promise对象。
问题:
在 doubleAfter2Seconds 功能中,总和是在" resolve" 功能中进行的,如果在示例中我们从未通过"解析& #34;函数(通过我认为的promise对象中的then方法)我们如何得到130结果?
祝你好运 提前致谢
答案 0 :(得分:1)
在doubleAfter2Seconds函数内,总和在“resolve”函数
中完成
没有
乘法在匿名(箭头)函数内部执行,该函数作为参数传递给Promise
。
该表达式的结果立即作为参数传递给resolve
函数。
resolve
函数由Promise构造函数创建,并作为第一个参数传递给(前面提到的)匿名函数。
(然后通过a
关键字将该值返回到b
,c
或await
。)
答案 1 :(得分:1)
then
未直接连接到resolve
。 resolve
被传递给promise executor函数(传递给new Promise
的函数)以用于解析promise。 then
只是挂钩处理程序以进行承诺解析,这些解决方案与resolve
函数没有直接关联,而是与promises的一般操作直接相关。
addAsync
函数中没有看到任何回调函数的原因是它是使用async
的{{1}}函数。 await
/ async
是承诺生成和消费的语法糖。粗略地说,如果我们删除那个语法糖,await
看起来像这样:
addAsync
或者更可读(或不是):
function addAsync(x) {
return doubleAfter2Seconds(10)
.then(a =>
doubleAfter2Seconds(20)
.then(b =>
doubleAfter2Seconds(30)
.then(c => x + a + b + c)
)
);
}
如您所见,我们致电function addAsync(x) {
return doubleAfter2Seconds(10)
.then(a => {
return doubleAfter2Seconds(20)
.then(b => {
return doubleAfter2Seconds(30)
.then(c => {
return x + a + b + c;
});
});
});
}
,等待其承诺解决,并将该分辨率值接收为doubleAfter2Seconds
,然后执行相同操作并获得a
的分辨率,然后再次使用b
,最后在我们拥有所有部分时执行c
。该函数返回一个promise(x + a + b + c
创建一个新的promise,记住),用该总和解析。
有关MDN的更多信息:
答案 2 :(得分:0)
函数doubleAfter2Seconds被调用3次,每次等待Promise返回,然后继续运行其余的代码
所以第一次调用它,2秒后:
a = 10 * 2 = 20
第二次,在其他2秒之后:
b = 20 * 2 = 40
第三次,在其他2秒之后:
c = 30 * 2 = 60
该函数由AddAsync调用,因此x将为10
最终结果计算如下:
a + b + c + x = 20 + 40 + 60 + 10 = 130
如果您不想传递resolve函数并使用,则需要嵌套函数doubleAfter2Seconds