Javascript异步函数和承诺

Javascript异步函数和承诺,javascript,async-await,es6-promise,Javascript,Async Await,Es6 Promise,下午好,在我的时区 我一直在阅读有关承诺和异步函数的内容,我看到一个页面,其中有一个代码示例: function doubleAfter2Seconds(x) { return new Promise(resolve => { setTimeout(() => { resolve(x * 2); }, 2000); }); } async function addAsync(x) { const a = await doubleAfter2S

下午好,在我的时区

我一直在阅读有关承诺和异步函数的内容,我看到一个页面,其中有一个代码示例:

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);
我使用了JSFIDLE和Chrome控制台: “toLog”变量是promiseValue为130的promise对象

问题:

double after2seconds函数中,求和是在的“resolve”函数中进行的,如果在本例中我们从未传递过“resolve”函数(我认为是通过promise对象中的then方法),我们如何得到结果

致意 提前谢谢

在doubleAfter2Seconds函数中,求和在“resolve”函数中进行

没有

乘法在匿名(箭头)函数内执行,该函数作为参数传递给
Promise

该表达式的结果立即作为参数传递给
resolve
函数

resolve
函数由Promise构造函数创建,并作为第一个参数传递给(前面提到的)匿名函数


(然后通过
wait
关键字将该值返回到
a
b
c

不直接连接到
解析
<代码>解析
传递给承诺执行器函数(传递给
新承诺
的函数),用于解析承诺
then
只是为promise resolution连接处理程序,这些处理程序与该
resolve
函数没有直接的联系,而是与promises的一般操作联系在一起

addAsync
函数中看不到任何回调函数的原因是它是使用
wait
async
函数<代码>异步
/
等待
是承诺生成和使用的语法糖。粗略地说,如果我们去掉这个语法糖,
addAsync
如下所示:

function addAsync(x) {
  return doubleAfter2Seconds(10)
    .then(a =>
        doubleAfter2Seconds(20)
            .then(b =>
                doubleAfter2Seconds(30)
                    .then(c => x + a + b + c)
            )
    );
}
或者更容易理解(或者不):

如您所见,我们在2秒后调用
double,等待其承诺解析,并以
a
的形式接收解析值,然后执行相同的操作并以
b
的形式获得解析,然后再次使用
c
,最后在我们拥有所有部件后执行
x+a+b+c
。该函数返回一个承诺(
,然后创建一个新的承诺,记住),并用该和进行解析

有关MDN的更多信息:

  • /

函数doubleAfter2Seconds被调用3次,每次它都会在继续运行其余代码之前等待承诺返回

因此,第一次调用时,在2秒后:

a = 10 * 2 = 20
c = 30 * 2 = 60
第二次,在其他2秒后:

b = 20 * 2 = 40
第三次,在其他2秒后:

a = 10 * 2 = 20
c = 30 * 2 = 60
该函数由AddAsync调用,因此x将为10

最终结果计算如下:

a + b + c + x = 20 + 40 + 60 + 10 = 130
如果您不想传递解析函数并使用,则需要在2秒后嵌套函数double

130=10+(10*2)+(20*2)+(30*2)
-您知道130从何而来吗?提示:
x+a+b+c