Javascript:如何检查异步操作是否仍然挂起/正在进行?

Javascript:如何检查异步操作是否仍然挂起/正在进行?,javascript,asynchronous,pending-transition,Javascript,Asynchronous,Pending Transition,我想知道是否有可能检查Javascript中的异步操作是否仍处于挂起状态。。 因为我正在调用一个特定的URL进行数据库请求。。。当db调用仍在进行时,我希望停止任何其他传入的db调用(这意味着,如果db请求仍挂起,请停止对该URL的任何进一步调用)。 这有可能吗 因为数据库调用最多需要几分钟,我不想在第一个数据库调用仍在进行时启动另一个数据库调用。。问题是,我不知怎么搞不清楚如何检查调用是否已经开始并且仍在进行中,因为只有当进程已经完成时,响应才会出现在.then()子句之后 这是我的db调用函

我想知道是否有可能检查Javascript中的异步操作是否仍处于挂起状态。。 因为我正在调用一个特定的URL进行数据库请求。。。当db调用仍在进行时,我希望停止任何其他传入的db调用(这意味着,如果db请求仍挂起,请停止对该URL的任何进一步调用)。 这有可能吗

因为数据库调用最多需要几分钟,我不想在第一个数据库调用仍在进行时启动另一个数据库调用。。问题是,我不知怎么搞不清楚如何检查调用是否已经开始并且仍在进行中,因为只有当进程已经完成时,响应才会出现在.then()子句之后

这是我的db调用函数:

const getWriteIndex = async () =>  {   
    return Promise.all(someFunction1, someFunction2...).then(...) {  

        writeMessageObject = checkDocuments(...);

        return Promise.resolve(writeMessageObject);       
       })).catch((err) => {           
           return Promise.reject(err);
       });
}
这是我使用express的URL/路由调用功能:

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 stati,,但我仍然想知道是否有可能通过查询静态promise属性来获取它们的实际状态(;)(但奇怪的是,我在网上找不到)

因此,我修复了请求的函数:

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 {   
           readmsg_obj.message = '';  

            if ((dbQueryPromiseRead != null) && dbQueryPromiseRead.isPending()) {
                logger.info(`Database request for Index-read is still pending!`);
                return;
            }

            dbQueryPromiseRead =  checkPendingRequest(getReadIndex());

            dbQueryPromiseRead.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 stati,,但我仍然想知道是否有可能通过查询静态promise属性来获取它们的实际状态(;)(但奇怪的是,我在网上找不到)

因此,我修复了请求的函数:

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 {   
           readmsg_obj.message = '';  

            if ((dbQueryPromiseRead != null) && dbQueryPromiseRead.isPending()) {
                logger.info(`Database request for Index-read is still pending!`);
                return;
            }

            dbQueryPromiseRead =  checkPendingRequest(getReadIndex());

            dbQueryPromiseRead.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);
            };

    } 
});

如果操作仍在运行,则需要尝试添加node.js,如
global.dbCallState
标志

这是所有模块的
global
var一。 不要像
global=newobject()那样更改此对象,但您可以使用子字段

您可以在另一个模块中更改它,如
global.dbCallState=false

这不是最好的解决方案,但它可以帮助



但我不知道,为什么你只想要一个连接。在node.js中阻止I/O不是一个好的解决方案,如果操作仍在运行,则需要尝试在node.js中添加类似于
global.dbCallState
标志的插件

这是所有模块的
global
var一。 不要像
global=newobject()那样更改此对象,但您可以使用子字段

您可以在另一个模块中更改它,如
global.dbCallState=false

这不是最好的解决方案,但它可以帮助



但我不知道,为什么你只想要一个连接。在node.js中阻塞I/O不是一个好的解决方案,可能会在promise的开头和DB操作的结尾放置一个标志,并检查需要检查的地方。或者,在
可序列化性上修改数据库的隔离,事务应该一个接一个地发生,这样就不会有干扰。您所说的“标志”是什么意思?我只是想知道我是否可以以某种方式将异步函数调用getReadIndex()分配给一个变量,例如const a=getReadIndex();然后检查a是否挂起(因为它应该是一个承诺)?通过标志,我的意思是生成一个全局var,当输入承诺时,将其值更改为
1
(运行),并在数据库的读取功能中将其值更改为
0
(完成)。然后,在运行下一个代码之前放置
while(flag)
,或者只检查它,如果它不是
0
,就不要再进一步了。起初我也这么认为,但这正是我的问题:当它运行时,你无法检查它是否真的在运行。。如何检查我是否输入了承诺?我可以在执行调用之前放置一个标志变量“running=true”,如果为true,则返回。但是它从一开始就不会执行函数……我在这里找到了一个链接,该链接如何在另一个函数中手动检查承诺的状态:,但我真的想知道是否不可能以更简单的方式查询承诺的实际状态,例如使用静态字段isPending或类似的方式,承诺中不存在一个本地字段,您可以简单地查询承诺的实际状态吗?!可能在承诺的开始和DB操作的结束处放置一个标志,并检查需要检查的位置。或者,在
可序列化性上修改数据库的隔离,事务应该一个接一个地发生,这样就不会有干扰。您所说的“标志”是什么意思?我只是想知道我是否可以以某种方式将异步函数调用getReadIndex()分配给一个变量,例如const a=getReadIndex();然后检查a是否挂起(因为它应该是一个承诺)?通过标志,我的意思是生成一个全局var,当输入承诺时,将其值更改为
1
(运行),并在数据库的读取功能中将其值更改为
0
(完成)。然后,在运行下一个代码之前放置
while(flag)
,或者只检查它,如果它不是
0
,就不要再进一步了。起初我也这么认为,但这正是我的问题:当它运行时,你无法检查它是否真的在运行。。如何检查我是否输入了承诺?我可以在执行调用之前放置一个标志变量“running=true”,如果为true,则返回。但是它从一开始就不会执行函数……我在这里找到了一个链接,该链接如何在另一个函数中手动检查承诺的状态:,但我真的想知道是否不可能以更简单的方式查询承诺的实际状态,例如使用静态字段isPending或类似的方式,承诺中不存在一个本地字段,您可以简单地查询承诺的实际状态吗?!你甚至不需要一个全局变量,一个静态变量(例如在模块范围内)就足够了。你甚至不需要一个全局变量,一个静态变量(例如在模块范围内)就足够了。为什么我的解决方案得到2减?为什么我的解决方案得到2减?