如何在节点 js 中突破 promise-then 链

How to break out of promise-then chain in node js

我正在从事 SOA 项目,我正在编写一个节点 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 后,下一个 SOA 将从 callback 函数执行。没有错误情况时一切正常。但是,如果服务器出现故障或处于任何其他故障情况下,我想脱离此 promise-then 链。

当前,如果出现任何错误,流程将转到 onFailure 方法,但在执行后,它会将控制权交给链中的下一个承诺 null 作为该方法的输入。

我想在遇到任何错误时退出 promise-then 链,并且 promise 的其余部分不应执行。如果有人能帮助我,我将不胜感激。

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

尝试像这样重构您的代码:

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

错误处理是承诺链的一部分。

或者您可以使用 async/await 做几乎相同的事情。

如果你想做一些实际的错误处理,你可以在这里添加你的 onFailure 函数,而不仅仅是 console.error