I\'m trying to chain nested .then functions and call the success functions, but call back is calling in the starting itself.
//public method fn
function fn(c         
        
Your { responseStatus: x } object exists solely for the purpose of flow control, which can be provided naturally by the success path and error path of a promise returned by fn();
Also, with promises, there's no need to pass a callback to fn() - indeed it is considered bad practice to do so.
So first,
callback all throughfunction fn() {
    return fn1().then(call1);
}
function call1() {
    return fn2().then(call2);
}
function call2() {
    return fn3().then(lastfunction);
}
function fn1() {
    //some code that returns a promise
}
function fn2() {
    //some code that returns a promise
}
function fn3() {
    //some code that returns a promise
}
Then, call as follows :
fn().then(function(response) {
    // success callback (your "200" condition)
    // show output;
}).catch(function(error) {
    // error callback (your "500" condition)
    // show error;
});
The response var will be whatever lastfunction() delivered. You have an issue if you want response to  be some aggregation of what is delivered by fn1(), fn2(), fn3() that is not already delivered by lastfunction(). That issue is comprehensively addressed here.
The error var will be the first Error to occur in the course of executing fn(), with no loss of information; error.message and error.status (if it exists) can be read/displayed.