2

function delay(count) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve(1000);
    }, count);
  });
}
async function method1() {
  let val = 0;
  console.log("one");
  val = delay(3000);
  console.log("two")
  return val;
}
method1().then(function(result) {
  console.log(result);
});

以上是我的示例代码。
首先,我没有使用await delay(),这就是我的意图。
首先,编写上述代码的预期流程如下:

  1. 控制台.log(“一个”)
  2. console.log("两个")
  3. 返回值;
  4. 控制台日志(结果)
  5. 解决(1000);

但实际情况不同。实际执行结果如下。

  1. 控制台.log(“一个”)
  2. console.log("两个")
  3. 解决(1000)
  4. 返回值;
  5. 控制台日志(结果)

我希望return val首先执行的原因是因为这是因为我们认为其余代码将在delay()函数进行异步通信时执行。然而,实际上,return直到delay()完成才执行。

如果我await delay()delay(). setTimeout退出后,console.log("two")执行,我完全理解这个概念。
但是,如果await不使用,则执行其余代码,但是为什么直到完成才执行return delay()

4

2 回答 2

2

这是因为我们相信其余的代码会在 delay() 函数执行时执行

您的代码与此等效。您将承诺分配给val. 因为val是 aPromise所以你可以使用then,并且在它解析后 3000 毫秒后,它会记录里面的值then

async function method1() {
  let val = 0;
  console.log("one");
  val = new Promise(function(resolve) {
    setTimeout(function() {
      resolve(1000);
    }, 3000);
  });
  console.log("two")
  return val;
}
method1().then(function(result) {
  console.log('**', result);
});

来自评论

据我所知,promise 只是在某个操作完成时运行的一段代码。

Promise 被急切地加载。在执行程序完成之前,构造函数不会返回。当 executor 获得结果时,它会调用其中一个函数resolveor reject。所以它不是在某个动作完成时运行的一段代码

在下面的示例中,您可以看到 Promise 在分配给变量后立即执行

async function method1() {
  let val = 0;
  console.log("one");
  val = new Promise(function(resolve) {
    setTimeout(function() {
      console.log('Inside Promise')
      resolve(1000);
    }, 3000);
  });
  console.log("two")
  return val;
}
method1()

于 2021-07-25T13:59:55.620 回答
1

实际执行结果如下。

1. console.log("one")
2. console.log("two")
3. resolve(1000)
4. return val;
5. console.log(result)

不,这不是正确的执行顺序。第 4 步将在第 3 步之前进行

您的代码执行如下:

  1. 称呼method1

    1. 声明val并将其初始化为 0

    2. 记录“一”

    3. 调用delay函数

      1. 创造一个新的承诺
      2. 调用setTimeout并安排回调函数
      3. delay从函数返回新创建的 Promise
    4. delay函数的返回值赋值给val

    5. 记录“二”

    6. val从返回method1

  2. then()在返回的承诺上调用方法method1

  3. 脚本结束

现在 一段时间后,计时器触发,解析返回的承诺method1,然后调用传递给then()方法的回调函数。

但是,如果不使用await,则执行其余代码,但是为什么直到delay()完成才执行return?

method1 delay函数执行完毕后返回。delay函数返回一个promise,然后将其分配给val变量。所有这些都是同步发生的。

delay该函数的执行在计时器触发并且 promise 被解决之前完成。

于 2021-07-25T14:06:02.677 回答