如何突破Node JS中的promise-then链

时间:2018-08-02 07:39:47

标签: javascript node.js promise request soa

我正在研究SOA项目,我正在编写一个Node js实用程序来完成我的工作。该实用程序从使用SOA调用登录到服务器开始,然后调用一系列SOA调用,其中每个SOA调用都取决于上一个调用的结果。

我已经使用promise-then框架来实现这一目标。下面是我的代码:

const loginPromise = postRequest(req, headersObj, loginUrl, Constants.loginData);
const queryPromise = loginPromise.then(loginSuccess, loginFailure);
const searchPromise = queryPromise.then(handleSavedQuerySearchResponse, onFailure);
const createPromise = searchPromise.then(handleSearchSoaResponse, onFailure);
const updatePromise = createPromise.then(handleCreateObjectSoaResposne, onFailure);
const plantDataPromise = updatePromise.then(handleUpdateObjectSoaResponse, onFailure);

function postRequest(request: any, header: any, reqUrl: string, jsonData: any): Promise<any> {
    return new Promise((resolve) => {
        request.post({
            headers: header,
            url: reqUrl,
            body: JSON.stringify(jsonData),
        }, (err: any, resp: any, bodyParam: any) => {
            resolve({error: err, response: resp, body: bodyParam});
        });
    });
}

在成功执行一个SOA时,将从callback函数执行下一个SOA。在没有错误的情况下,一切正常。但是,如果服务器已关闭或在任何其他故障情况下,我都希望退出此promise-then链。

当前,如果发生任何错误,流程将进入 onFailure 方法,但是在执行之后,它将控制权交给链中的下一个Promise,并以null作为该方法的输入。

无论何时遇到任何错误,我都想摆脱promise-then链,而其他promise不应执行。如果有人可以帮助我,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

此代码尚未经过测试,因此应该比实际解决方案更像是伪代码:

尝试像这样更重组代码:

const request = require('request-promise-native')

postRequest(req, headersObj, loginUrl, Constants.loginData)
    .then(loginSuccess)
    .then(handleSavedQuerySearchResponse)
    .then(handleSearchSoaResponse)
    .then(handleCreateObjectSoaResposne)
    .then(handleUpdateObjectSoaResponse)
    .catch(console.error)

function postRequest(request: any, header: any, reqUrl: string, jsonData: any): Promise<any> {
    return request.post({
        headers: header,
        url: reqUrl,
        body: JSON.stringify(jsonData),
    }, (err: any, resp: any, bodyParam: any) => {
            resolve({error: err, response: resp, body: bodyParam});
    });
}

错误处理是Promise链的一部分。

或者您可以使用async / await进行几乎相同的操作。

如果您想进行一些实际的错误处理,则可以在此处添加onFailure函数,而不仅仅是console.error