JavaScript:使用 await 使 asnyc 代码看起来更同步 [重复]

Posted

技术标签:

【中文标题】JavaScript:使用 await 使 asnyc 代码看起来更同步 [重复]【英文标题】:JavaScript: Using await to make asnyc code look more synchronous [duplicate] 【发布时间】:2020-10-05 09:23:57 【问题描述】:

我正在尝试了解 asnyc 等待功能。 因此,我想使用一个 asnyc 函数,解决它并执行以下日志随后

我如何实现这一目标?还是我理解的根本错误?

const test = async function() 
    console.log('hi 1');
    await setTimeout(() => 
        console.log('timout1')
    , 1000);
    console.log('hi 2');
    console.log('hi 3');

test()

结果

hi 1
hi 2
hi 3
timout1

预期结果

hi 1
timout1
hi 2
hi 3

【问题讨论】:

【参考方案1】:

我希望这段代码能帮助你理解异步等待。

function resolveAfter2Seconds() 
  	return new Promise(resolve => 
    	setTimeout(() => 
      		resolve('resolved');
    	, 2000);
  	);


async function asyncCall() 
  	console.log('hi 1');
  	const result = await resolveAfter2Seconds();
  	console.log(result);
  	console.log('hi 2');
  	console.log('hi 3');


asyncCall();

【讨论】:

【参考方案2】:

您只能将await 用于promise,而setTimeout 函数不会返回Promise。但是,您可以等待使用 setTimeout 解决的 Promise,这样会给您想要的结果。

因此,函数执行将停止,直到被 awaited 的 Promise 解决或被拒绝,然后继续。

const test = async function() 
  console.log('hi 1');
         // return a new promise resolved after setTimeout callback is fired
  await (new Promise((resolve, reject) => 
    setTimeout(() => 
      console.log('timout1')
      resolve()
    , 1000)
  ))
  console.log('hi 2');
  console.log('hi 3');


test()

希望这会有所帮助!

【讨论】:

啊!你说的对!仅仅因为 setTimeout() 是 asnyc 并不意味着它是一个承诺!

以上是关于JavaScript:使用 await 使 asnyc 代码看起来更同步 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 async 和 await 使方法异步?

如何不忘记在 Javascript 中到处使用 await?

JavaScript中async和await的使用以及队列问题

为什么需要在 JavaScript 中使用顶层 await?

Javascript 如何在 mysql 中使用 Async/Await

微软推出TypeScript 1.7