我想在我的API中获取一些缓存数据,并执行一个DB更新查询.我已经写了代码,它运行得很好,但据我所知,它不应该运行.有人能解释一下这里的一切将如何执行吗?
const slowDbUpdate = () => {
return new Promise((res, rej)=>{
setTimeout(()=>{
return res("DATA UPDATED");
}, 10000);
})
}
const fastCacheGet = () => {
return new Promise((res, rej)=>{
setTimeout(()=>{
return res({ cache: "fast", db: "slow" });
}, 1000);
})
}
const test = async () => {
try {
slowDbUpdate().then(res => console.log(res));
const data = await fastCacheGet();
return data;
} catch (error) {
console.log("Error", error);
}
}
编辑2: 我正在运行这个函数,我只是没有费心写下来.
test().then(res => console.log(res));
所以这就是我所理解的应该发生的事情:
- 函数
test
在调用堆栈中被推送并开始执行. - JS调用
slowDbUpdate
函数,看到它返回promise ,将.then
方法中的回调推入微任务队列. - 然后,它调用
fastCacheGet
函数,并将其推入队列. - (这是我不确定的地方)1秒过go 了,
fastCacheGet
Promise解析,但事件循环没有看到解析的第一个Promise,并且不调用它的回调. - 10秒后,
slowDbUpdate
函数解析,事件循环将其回调推送到调用堆栈,然后将fastCacheGet
回调推送到堆栈上,因为它已经解析.
但当我确实运行代码时,它的工作方式与我希望的一样(即返回缓存数据(编辑2:记录{ cache: "fast", db: "slow" }
),并在10秒后记录"数据更新"),而不是我认为它应该的方式.我显然误解了JS的工作原理,任何帮助都是非常感谢的!
谢谢!
编辑1:我也忘了问这个,但我使用的是Node.js和Express后端.我试着做的事情从一开始就是个好主意吗?可以说,这是我第一次try 在没有完成所有工作的情况下发送回API响应.我不认为这应该是一个问题,但是如果我开始在很多API中这样做/这个API被非常频繁地调用会发生什么.我知道我必须在这样的promise 的末尾加上.catch
,因为它会把应用程序当做一个未经处理的拒绝来崩溃,以防它抛给我一个错误,但还有什么会出错呢?