我有一个呈现一些html的函数,我不知道如何在这里调用setInterval函数,每60秒调用一次render func
const Home = {
render: async () => {
const cryptos = await getAllCryptos();
const view = `
<section class="section">
<table>
${cryptos.data.map(crypto =>
`<tr>
<td class="name"><a href="/src/#/crypto/${crypto.id}">${crypto.name}</a> </td>
<td>${crypto.symbol}</td>
<td>${crypto.quote.USD.price}</td>
<td>${crypto.quote.USD.percent_change_24h}</td>
</tr>`
)}
</table>
</section>
`;
return view
}
};
export default Home;
我真的不能将渲染功能放在setInterval
中,所以我想知道什么是最好的方法?
答案 0 :(得分:6)
实际上,鉴于setInterval
涉及异步处理,因此使用render
会很混乱。
相反,最好将一系列setTimeout
链接在一起:
const RENDER_INTERVAL = 60000; // 60 seconds in milliseconds
function handleRender() {
Home.render()
.then(html => {
// ...use the HTML...
})
.catch(error => {
// ...report the error...
})
.finally(scheduleRender);
}
function scheduledRender() {
setTimeout(handleRender, RENDER_INTERVAL);
}
该代码假定即使对Home.render
的一次调用失败,您也希望继续。
如果您要使用上次致电render
的开始的60秒而不是结束时间(以上是结束时间的60秒),则可以更多逻辑:
const RENDER_INTERVAL = 60000; // 60 seconds in milliseconds
let lastRenderStart = 0;
function handleRender() {
lastRenderStart = Date.now();
Home.render()
.then(html => {
// ...use the HTML...
})
.catch(error => {
// ...report the error...
})
.finally(scheduleRender);
}
function scheduledRender() {
setTimeout(handleRender, Math.max(0, RENDER_INTERVAL - (Date.now() - lastRenderStart));
}
handleRender();