【发布时间】:2019-07-26 20:59:11
【问题描述】:
我想知道是否可以通过某种方式检查 Javascript 中的异步操作是否仍在等待中。 因为我正在对调用特定 URL 进行数据库请求...虽然 db 调用仍在进行中,但我想停止任何其他传入的 db-calls(这意味着,如果 db-请求仍在等待中)。 这有可能吗?
因为数据库调用最多需要几分钟,而且我不想在第一个数据库调用仍在进行时启动另一个数据库调用。问题是,我不知道如何检查调用是否已经开始并且仍在进行中,因为响应仅在进程已经完成时的 .then() 子句之后出现。
这是我的数据库调用函数:
const getWriteIndex = async () => {
return Promise.all(someFunction1, someFunction2...).then(...) {
writeMessageObject = checkDocuments(...);
return Promise.resolve(writeMessageObject);
})).catch((err) => {
return Promise.reject(err);
});
}
这是我的 URL/Route Call 函数,带有 express:
router.get("/v1/...", someMiddleware(), async function(req,res,next) {
if (read_cached() && initialised_read) {
res.setHeader('Content-Type', 'application/json');
res.json(readmsg_obj);
} else {
try {
//HOW CAN I CHECK HERE IF THE DB-CALL IS ALREADY IN PROGRESS?
readmsg_obj.message = '';
getReadIndex().then((message) => {
initialised_read = true;
readmsg_obj = {...message};
res.setHeader('Content-Type', 'application/json');
res.json(readmsg_obj);
}).catch((reject) => {
logger.error(`/../... : ${reject}`);
initialised_read = false;
res.status(500).send(reject);
});
} catch(err) {
logger.error(`/v1/... : ${err}`);
res.status(500).send(err);
};
}
});
【问题讨论】:
-
也许在promise的开头和数据库操作的结尾放置一个标志,并检查它需要检查的地方。或者,修改
serializability上的数据库隔离,事务应该一个接一个地发生,这样就不会有干扰。 -
“标志”是什么意思?我现在只是想知道我是否可以以某种方式将异步函数调用 getReadIndex() 分配给一个变量,例如 const a = getReadIndex();然后检查它是否挂起(因为它应该是一个承诺)?
-
通过标志我的意思是创建一个全局变量,当输入承诺时将其值更改为
1(运行),并在数据库的读取函数中将其值更改为0(完成)。然后,在运行下一个代码之前输入while(flag),或者只是检查它,如果不是0,请不要再进一步。 -
一开始我也是这么想的,但这正是我的问题:当它运行时,你无法检查它是否真的在运行..如何检查我是否输入了promise?我可以在执行调用之前放置一个标志变量“running=true”,如果为真,我会返回。但是它一开始就永远不会执行该功能....
-
我在这里找到了一个链接,如何在另一个函数中手动检查承诺的状态:ourcodeworld.com/articles/read/317/…,但我真的想知道是否无法以某种方式查询承诺的实际状态一种更简单的方法,例如使用静态字段 isPending 或类似的东西,Promises 中是否不存在一个本地字段,您可以在其中简单地查询 Promise 的实际状态?!
标签: javascript asynchronous pending-transition