Search code examples
node.jspromisenode-oracledb

Node js stop long process task when Promise reject it


I create a promise function to processing a long-time query task. Some time the task will block for hours. I want set a time out to stop the task. Below is the code.

It can return error message correctly, but it still running connection.execute() for long time before stop. So how can stop it immediately when it return reject message?

Thanks!

function executeQuery(connection, query) {
return new Promise((resolve, reject) => {
    "use strict";
    //long time query
    connection.execute(query, function (err, results) {
        if (err) reject('Error when fetch data');
        else resolve(results);
        clearTimeout(t);
    });

    let t = setTimeout(function () {
        reject('Time Out');
    }, 10);
})


(async () => {
"use strict";
oracle.outFormat = oracle.OBJECT;

try {
    let query = fs.readFileSync("query.sql").toString();
    let results = await executeQuery(connection, query);

    console.log(results.rows);
} catch (e) {
    console.log(`error:${e}`);

}

Solution

  • So how can stop it immediately when it return reject message?

    According to the docs, you can use connection.break:

    return new Promise((resolve, reject) => {
        connection.execute(query, (err, results) => {
            if (err) reject(err);
            else resolve(results);
            clearTimeout(t);
        });
    
        const t = setTimeout(() => {
            connection.break(reject); // is supposed to call the execute callback with an error
        }, 10);
    })
    

    Make sure to also release the connection in a finally block.