Javascript:如何检查异步操作是否仍在等待处理/正在进行中?

时间:2019-03-05 11:41:24

标签: javascript asynchronous pending-transition

我想知道是否有可能检查Javascript中的异步操作是否仍在等待中。 因为我正在执行有关调用特定URL的数据库请求...,而db调用仍在进行中,所以我想停止任何其他传入的db-calls(这意味着,停止所有对该URL的进一步调用,以防db-请求仍待处理)。 有可能吗?

因为数据库调用最多需要几分钟,并且我不想在第一个数据库调用仍在进行时启动另一个数据库调用。问题是,我以某种方式无法弄清楚如何检查该调用是否已开始并且仍在进行中,因为只有在过程完成后,响应才在.then()子句之后出现。

这是我的数据库调用函数:

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

    } 
});

2 个答案:

答案 0 :(得分:0)

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

global变体用于所有模块。 请勿像global = new Object();那样更改此对象,但是可以使用子字段。

https://nodejs.org/api/globals.html

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

这不是最佳解决方案,但可以提供帮助。


但是我不知道,为什么只需要一个连接。在node.js中阻止I / O的解决方案不是很好的解决方案

答案 1 :(得分:-1)

嗯,我在这里找到了解决方法: https://ourcodeworld.com/articles/read/317/how-to-check-if-a-javascript-promise-has-been-fulfilled-rejected-or-resolved

所以我写了那个函数来检查承诺状态,但是我仍然想知道是否不可能以某种方式查询静态的promise属性以获取其实际状态;)(但是很奇怪,我没有在网上找不到任何内容。

const checkPendingRequest= (promise) => {
    if (promise.isResolved) return promise;    
        // Set initial state
        var isPending = true;
        var isRejected = false;
        var isFulfilled = false;

        // Observe the promise, saving the fulfillment in a closure scope.
        var result = promise.then(
            function(v) {
                isFulfilled = true;
                isPending = false;
                return v; 
            }, 
            function(e) {
                isRejected = true;
                isPending = false;
                throw e; 
            }
        );

        result.isFulfilled = function() { return isFulfilled; };
        result.isPending = function() { return isPending; };
        result.isRejected = function() { return isRejected; };
        return result;    
}

所以我为请求修复了功能:

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

    } 
});