Javascript: Как проверить, если асинхронная операция все еще ожидает / в процессе? - PullRequest
0 голосов
/ 05 марта 2019

Я хотел бы знать, возможно ли каким-то образом проверить, еще не завершена ли асинхронная операция в Javascript .. Поскольку я делаю запрос к базе данных о вызове определенного URL-адреса ... Пока вызов db все еще выполняется, я хочу прекратить любые другие входящие вызовы db (что означает, прекратить любые дальнейшие вызовы этого URL-адреса в случае, если 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 с экспресс:

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 голосов

Вам нужно попробовать добавить в node.js как global.dbCallState флаг, если операция все еще выполняется.

Это global var один для всех модулей. Не изменяйте этот объект как global = new Object();, но вы можете использовать дочерние поля.

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

Вы можете изменить его в другом модуле, например global.dbCallState = false.

Это не лучшее решение, но оно может помочь.


Но я не знаю, почему вы хотите только одно соединение. Это не хорошее решение для блокировки ввода-вывода в node.js

0 голосов
/ 05 марта 2019

хм, я нашел обходной путь здесь: https://ourcodeworld.com/articles/read/317/how-to-check-if-a-javascript-promise-has-been-fulfilled-rejected-or-resolved

поэтому я написал эту функцию для проверки состояния обещания, , но мне все еще интересно, нельзя ли как-нибудь запросить статические свойства обещания, чтобы получить их фактическое состояние ;) (но странно, я не найти в Интернете).

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

    } 
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...