如何使用 setTimeout 等待延迟操作的结果?

How does one await the result of a deferred operation with setTimeout?

提问人:SAMRAT PATEL 提问时间:1/16/2023 最后编辑:Peter SeligerSAMRAT PATEL 更新时间:1/31/2023 访问量:109

问:

function z(){
setTimeout(()=>{
        console.log("A")
    },3000)
}

z()
console.log("B")

我预期的输出

A(3 sec delay)

B

我得到的输出

B

A(3 sec delay)

如何使用此异步代码获取同步行为?

javascript async-await settimeout es6-promise

评论

4赞 JSON Derulo 1/16/2023
这就是工作原理,请参阅文档。里面的回调函数是定时器到期后要执行的函数setTimeout
5赞 Felix Kling 1/16/2023
根据上下文,基本上有两种选择:(1)接受在超时到期后调用的回调。放在那里。(2) 转换为返回一个 promise(当超时到期时解析)并使用 .这样,您仍然可以以同步方式编写代码。zconsole.log('B')zawait z()
0赞 Jan Pfeifer 1/16/2023
javascript.info/async-await
0赞 connexo 1/17/2023
你的期望有什么意义?
0赞 Peter Seliger 3/15/2023
@SAMRATPATEL......关于迄今为止提供的唯一答案/解决方案,还有什么问题吗?

答:

0赞 Peter Seliger 1/16/2023 #1

对于第一个解决方案,OP 需要......

  • 编写一个函数,该函数接受一个数字值(表示毫秒)并返回一个 Promise 实例,该实例在提供的延迟后解析wait
  • 通过 promise 的 then 方法在等待的时间之后记录 to be delay 值来利用该函数。wait

function wait(msec) {
  return new Promise(resolve =>
    setTimeout(resolve, msec)
  );  
}

console.log('A');
wait(3000)
  .then(() => console.log('B'));
.as-console-wrapper { min-height: 100%!important; top: 0; }

对于第二种解决方案,可以将上面提供的代码重写为异步函数,该函数会记录 OP 的两个值,并在日志记录之间等待 返回的 promise。wait

function wait(msec) {
  return new Promise(resolve =>
    setTimeout(resolve, msec)
  );  
}

(async () => {

  console.log('A');
  await wait(3000);
  console.log('B');

})();
.as-console-wrapper { min-height: 100%!important; top: 0; }