【问题标题】:Awaiting promises which is assigned to a variable等待分配给变量的承诺
【发布时间】:2020-04-30 21:15:13
【问题描述】:

考虑下面的代码,

// Function which returns a promise and resolves in 2 seconds
const promiseFunction = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('resolved');
    }, 2000);
  });
};

// Asynchronous function 1
const asyncFunction1 = async() => {
    console.log(await promiseFunction());
    console.log(await promiseFunction());
    console.log(await promiseFunction());
}

// Asynchronous function 2
const asyncFunction2 = async() => {
    let a = promiseFunction();
    let b = promiseFunction();
    let c = promiseFunction();

    console.log(await a);
    console.log(await b);
    console.log(await c);
}

我试图了解 asyncFunction1 和 asyncFunction2 执行之间的行为, 当未分配给变量时, asyncFunction1 每次等待(总共 6 个)需要 2 秒,但 asyncFunction2 当分配给一个变量时,在总共 2 秒内解决所有 3 个承诺,当它被分配时会发生什么 分配给变量? (我们仍然使用 await 和变量)。

【问题讨论】:

    标签: javascript async-await es6-promise


    【解决方案1】:

    Promise 构造函数中传入的回调函数在创建promise 时开始执行(这是Observable 和Promise 的主要区别)。请看第一个代码。

    // Asynchronous function 1
    const asyncFunction1 = async() => {
        console.log(await promiseFunction());
        console.log(await promiseFunction());
        console.log(await promiseFunction());
    }
    

    此函数为每个函数等待 2 分钟,因此需要 6 秒。而第二个函数的工作方式不同。

    // Asynchronous function 2
    const asyncFunction2 = async() => {
        let a = promiseFunction();
        let b = promiseFunction();
        let c = promiseFunction();
    
        console.log(await a);
        console.log(await b);
        console.log(await c);
    }
    

    它同时执行 3 个回调函数。它的工作原理与 await Promise.all() 完全相同。因此 asyncFunction2 将在大约 2 秒内解决。

    【讨论】:

      【解决方案2】:

      对于

      asyncFunction1

      1. 他们将一个接一个地启动函数。这意味着第二个函数要等到第一个函数结束。
      2. 因为你直接在 await 上调用函数

      asyncFunction2

      1. 对于这种情况,它将同时启动所有功能。因此该功能在立即调用时触发。以便立即启动计时器
      2. 这就是所有函数同时执行的原因

      检查我下面的控制台。你可以看到不同的

      const promiseFunction = () => {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            resolve('resolved');
          }, 2000);
        });
      };
      
      // Asynchronous function 1
      const asyncFunction1 = async() => {
          console.log(await promiseFunction(),1);
          console.log(await promiseFunction(),1);
          console.log(await promiseFunction(),1);
      }
      
      // Asynchronous function 2
      const asyncFunction2 = async() => {
          let a = promiseFunction();
          let b = promiseFunction();
          let c = promiseFunction();
      
          console.log(await a,2);
          console.log(await b,2);
          console.log(await c,2);
      }
      asyncFunction1();
      asyncFunction2();

      【讨论】:

        【解决方案3】:

        当你调用promiseFunction() 时定时器启动,因此当你调用await a 时,所有三个定时器都已经在运行。然后当a在2秒后完成时,其他的也已经完成了。

        【讨论】:

        • 当然,你是对的。但我认为解释 Promise 的基本原理有助于更好地理解。
        猜你喜欢
        • 1970-01-01
        • 2018-08-30
        • 2013-09-16
        • 2020-05-10
        • 2019-09-18
        • 2019-04-29
        • 2020-10-31
        • 2018-12-23
        • 2019-12-10
        相关资源
        最近更新 更多