繁体   English   中英

async await如何在JavaScript中使用setTimeout()

[英]How async await works in JavaScript with setTimeout()

为什么这段代码不起作用

我想以简单的方式学习同步

const post = [];

function getPost(post) {
     console.log(post)
 }

async function createPost (post) {
  await setTimeout(() => {
    post.push({
      name: "John", work: "Developer"
    })
  }, 1000)
  getPost(post);
}

createPost(post);

它不起作用,因为setTimeout不返回promise。 如果您await非承诺,您只需立即获得价值(几乎为1)。 您还希望使用createPost返回的承诺,您的代码当前没有这样做。

您必须为setTimeout创建一个返回promise的包装器,例如我的答案中所示 ,尽管这些天我会稍微修改一下:

function timeout(delay, ...args) {
    return new Promise(function(resolve) {
        setTimeout(resolve, delay, ...args);
    });
}

这是应用于你的代码的,虽然我假设你的代码中的setTimeout实际上是一些其他异步操作(ajax,MongoDB等)的替身,我不会这样构造代码(我有post创建并由createPost返回,而不是createPost关闭的数组):

 function timeout(delay, ...args) { return new Promise(function(resolve) { setTimeout(resolve, delay, args); }); } const post = []; function getPost(post) { console.log(post) } async function createPost(post) { await timeout(1000); post.push({ name: "John", work: "Developer" }); getPost(post); } // Going async at top level (async () => { await createPost(post); })().catch(error => { console.error(error); }); 


¹ “几乎立即” a = await b; ... a = await b; ...对于Promise.resolve(b).then(a => ...) (加上错误处理)是语法糖(真的,非常好的糖)。 如果b不是一个承诺,分配给a发生在任务之后microtask处理await中出现。更多的任务和microtasks 这里我的答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM