如何在节点 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
我正在从事 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