基本上,我必须执行POST请求,然后尝试在获得此POST的返回值并将此信息保存到数据库后,将这些数据保存在API上。
因此,我在另一个promise中调用了一个promise using
,尽管发出了警告,但仍按预期工作:
未处理的拒绝StatusCodeError:400
(saveProcessedData or saveErrorData)
如何捕获此错误?
答案 0 :(得分:2)
如果您不混合使用回调并答应您的操作方式,那就更好了。之所以收到该错误,是因为您未在api._request
回调中正确处理错误。
将代码包装在try/catch
中的回调中,因为这是您处理async
函数中的异常的方式。
new Promise(async resolve => {
await Promise.reject() // Unhandled Promise Rejection
}).catch(console.error) // not catched
应该是:
new Promise(async resolve => {
try {
await Promise.reject()
resolve();
} catch(e) {
reject(e)
}
}).catch(console.error) // catched
无论如何,由于您将api._request
包装在Promise中,因此最好这样做:
const sendData = async(data, item) => {
// ...
const { error, response, body } = await new Promise((resolve, reject) => {
api._request(options, (error, response, body) => resolve({ error, response, body }))
})
if(!response.body.errorCode && response.statusCode === 200) {
payload = {
body: response.body,
type: data.req.body.type
}
dataProcessed = await db.saveProcessedData(payload);
} else {
payload = {
body: item,
type: data.req.body.type,
description: response.body.message
}
dataProcessed = await db.saveErrorData(payload);
}
return dataProcessed;
}
并将.catch
处理程序附加到.sendData
除了代码中的内容,如果error
是真实的,那么您将拒绝,然后resolving
,在这种情况下不会发生任何错误,但是最好使用return reject()
。一个承诺,不能被拒绝和解决。
if (error) {
return reject(error)
}
resolve(dataProcessed);
如果您使用的是request
,则可以使用request-promise
或request-promise-native
这两个request
包周围的Promise包装器。
答案 1 :(得分:1)
致电placement="top"
时,可以使用sendData()
来捕获承诺中发生的异常,包括任何Promise.prototype.catch()
:
reject()
答案 2 :(得分:1)
只需格式化
const sendData = async (data, item) => {
const options = {
method: data.endpoint.method,
url: api._url + data.endpoint.url,
headers: {
'Postman-Token': api._postmanToken,
'cache-control': api._cache,
'x-ccasset-language': 'en',
Authorization: data.token
},
body: item,
json: true
};
return Promise.resolve()
.then(() =>
new Promise((resolve, reject) => {
api._request(options, (error, response) => {
if (!response.body.errorCode && response.statusCode === 200) {
return resolve(
{
body: response.body,
type: data.req.body.type
}
);
}
return reject({
body: item,
type: data.req.body.type,
description: error || response.body.message
});
})
}))
.then(payload => db.saveProcessedData(payload))
.catch(payload => db.saveErrorData(payload))
}