当前位置: 首页 > 知识库问答 >
问题:

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

冀啸
2023-03-14

我如何做到这一点?还是我理解了一些根本错误的东西?

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

共有2个答案

谷弘致
2023-03-14

我希望这段代码能帮助您理解async Wait。

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();
公西修文
2023-03-14

您可以仅对promise使用wait,并且setTimeout函数不返回Promise。然而,你可以等待一个promise,这是解决使用setTimeout这样会给你想要的结果。

因此,函数执行将停止,直到被waited的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()
 类似资料:
  • 假设我有以下内容: 然后我这样称呼它: 我省略了并且没有将声明为这一事实是否使它实际上是异步的? 我希望发生的情况是循环会立即完成,因为即使花费了很长时间,也不会被等待,并且会立即返回。 我认为这会导致文件内容在这样调用时被覆盖的问题,但这使我认为代码是以某种方式自动转换为同步代码的(尽管似乎不可能知道何时完成)。 那么,简单地说,从非异步方法调用函数是否会自动使代码同步执行,以及省略和(如在函数

  • 问题内容: 我们正在与节点合作,主要用于内部项目,并了解使用该技术的最佳方法。 并非来自特定的异步背景,学习曲线可能是一个挑战,但是我们已经习惯了框架和学习过程。 使我们两极分化的是,何时才是使用同步代码与异步代码的最佳时间。我们目前使用的规则是,如果任何东西与IO进行交互,那么它必须通过回调或事件发射器(即给定的)是异步的,但是可以将任何未使用IO的其他项构造为同步函数(此方法还将取决于函数本身

  • 问题内容: 我需要一些Scala和Java代码的代码示例(并且我也对此感到很好奇),这些示例表明Scala代码比用Java编写的代码更简单,简洁(当然,两个示例都应该解决相同的问题)。 如果只有Scala示例带有注释,例如“这是Scala中的抽象工厂,在Java中看起来会很麻烦”,那么这也是可以接受的。 谢谢! 我最喜欢的所有接受和这个答案 问题答案: 让我们改进堆栈器的示例,并使用Scala的c

  • 当我在阅读有关承诺的文章时,我知道当我使用async/Await时,我可以同步打印承诺(在本例中为print:first,second,third,last to print)。现在我也读到了使用链接和异步/等待也可以达到同样的目的。然而,当我试图将我的承诺链接起来时,除了“最后一次打印”的console.log之外,什么也没有发生。任何洞察力都会很棒!谢谢!! 编辑到问题: 日志: 1:如果传递

  • 异步代码是指当调用后不会立即完成的代码。 setTimeout(() => { console.log('do stuff'); }, 3000 ) 在 setTimeout 执行完3秒后 do stuff 会输出到控制台。我们可以看出当指定的时间过去后我们所提供的异步函数会触发。现在来看个更有启发性的示例: doWork( () => { console.log('call me whe

  • 在C++中使用异步函数总是一个好主意吗? 我的意思是,很多时候,我们可能需要做一些简单的事情,比如做一个函数,返回天气,不是素数,等等,那么,这会使C++代码更快还是更慢呢? //示例代码 感谢阅读