javascript - setTimeOut() 以意想不到的方式工作
问题描述
我刚开始尝试使用 setTimeout() 函数的异步 JS。我在一个 JS 数组中硬编码了两个对象,并添加了一个以 3S 延迟运行的方法。我编写了另一种打印数组的方法(HTML Response 和 Console.log)。打印到响应似乎工作正常,即在调用posts.push(post)之前,只有两个对象被写入 HTML 响应。
但有时 console.log() 会打印 3 个对象,要么在“开始 addpost”之前,要么有时甚至在addPost()调用之前,而addPost仅在 5000 毫秒后调用。不知道我在这里做错了什么。有人可以帮忙吗?
const posts = [{
body: "I am Post One",
title: "Post One"
},
{
body: "I am post two",
title: "Post Two"
}
]
function addPost(post) {
setTimeout(function() {
console.log("begin addpost");
let output = "<p> ";
posts.forEach(function(post) {
output += (post.body + "<br/>");
});
output += "</p>";
document.body.innerHTML = output;
posts.push(post);
console.log("end addpost");
}, 5000);
}
function getPosts() {
setTimeout(function() {
console.log("begin getpost");
console.log(posts);
console.log("end getpost");
}, 1000);
}
console.log(posts);
addPost({
body: "I am post Three",
title: "Post Three"
});
getPosts();
解决方案
我认为这条线是您的控制台打印 3 个对象而不是两个对象的原因。
posts.push(post);
这是在您不重新初始化帖子对象时引起的。(这实际上需要您重新加载)。我不确定这是您面临的真正问题,但是在阅读了您的代码几分钟后,我看不到任何其他可能性。
此外,如果您尝试使用 JavaScript 进行异步操作,这可能是一种更短、更简洁的方式来做您想做的事情:
const posts = [{
body: "I am Post One",
title: "Post One"
},
{
body: "I am post two",
title: "Post Two"
}
]
async function wait(ms) {
// please do read more about Promise & arrow function to understand the syntax.
return new Promise(_ => setTimeout(_, ms));
}
const getPost = async () => {
await wait(1000);
console.log("begin getpost");
console.log(posts);
console.log("end getpost");
}
const printPost = async () => {
await wait(4000);
console.log("begin addpost");
let output = "<p> ";
posts.forEach(function(post) {
output += (post.body + "<br/>");
});
output += "</p>";
document.body.innerHTML = output;
console.log("end addpost");
}
(async () => {
getPost();
printPost();
})();
这将更具可读性。用 JavaScript 玩得开心!
推荐阅读
- css - 为父元素添加样式
- css - CSS:代码中设置的样式类组合与用户操作应用的组合问题,想要限制子类
- javascript - 带有母版页/模板的 React Router V4 路由器
- python - 访问参数帮助字符串中的“隐式”元变量值
- javascript - 防止 React-Select 一直为空白
- javascript - 从生成器传播收益,同时以相同的方式使用它们(重用)
- angularjs - 打字稿日期格式不起作用
- hibernate - 尝试使用 wildfly13 部署时出现“NoSuchException”异常
- ios - iOS 应用程序 - iOS 11.4 随机崩溃
- arrays - 过滤 JSON 对象