Javascript异步函数和承诺

时间:2018-03-28 10:58:39

标签: javascript async-await es6-promise

我的时区下午好。

我一直在阅读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结果?

祝你好运 提前致谢

3 个答案:

答案 0 :(得分:1)

  

在doubleAfter2Seconds函数内,总和在“resolve”函数

中完成

没有

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

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

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

(然后通过a关键字将该值返回到bcawait。)

答案 1 :(得分:1)

then未直接连接到resolveresolve被传递给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