等待被分配给一个变量的 Promise。

5
考虑下面的代码:
// 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没有分配给变量时,每个await需要2秒(总共6个),但是当asyncFunction2分配给变量时,它在总共2秒内解决了所有3个promises,这种情况下,分配给变量会发生什么?(我们仍然使用变量进行等待)。

3个回答

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

1
当然,你是正确的。但我认为解释Promise的基础知识会有助于更好地理解。 - Darko Vasilev

2

在 Promise 构造函数中传递的 回调函数,会在创建 Promise 时开始执行(这是 Observable 和 Promise 之间的主要区别)。请看下面的第一段代码。

// 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);
}

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


1

对于

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();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接