[英]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.