如何处理异步获取不良结果?

超越

我有以下React Native客户端代码:

confirmMatchRecord(userId, matchedUserData['userId'], matchRecordData['matchRecord']['matchWinner'], matchRecordData['matchType'], currentUserRating, matchedUserRating, matchData['_id'], matchRecordData['matchRecord']['_id'], airbnbRatingValue, true, new Date())
.then((results) => {
    // Do stuff
})
.catch((error) => {
    Alert.alert('Error', 'There was an issue with confirming the record. Please check your connection and/or try again later.');
});

以及我的confirmMatchRecord函数中的以下代码

export async function confirmMatchRecord(userId, matchedUserId, matchWinner, matchType, currentUserRating, matchedUserRating, matchId, matchRecordId, matchRating, matchConfirmed, timestamp) {
  console.log('Attempting to record match');

  info = { userId, matchedUserId, matchWinner, matchType, currentUserRating, matchedUserRating, matchId, matchRecordId, matchRating, matchConfirmed, timestamp }

  const firebaseIdToken = await AsyncStorage.getItem('@firebaseIdToken')
  const requestOptions = {
      method: 'POST',
      headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + firebaseIdToken },
      body: JSON.stringify(info)
  };
  const response = await fetch(ngrokOrLocalhost + '/confirmmatchrecord', requestOptions)
    if (response['Status']==='Failure') {
        // throw new Error(`HTTP error! status: ${response.status}`);
        throw new Error(400);
    } else if (response['Status']==='Success') {
        const data = await response.json()
        return data
    }
}

服务器代码:

router.post('/confirmmatchrecord', async (req, res) => {
// Do a lot of stuff

if (response==='Success') {
    return res.status(200).json({'Status': 'Success'})
} else {
    return res.status(400).json({'Status': 'Failure'})
    console.log('Match record was not confirmed successfully');
}

如您所见,当response ['Status'] ==='Failure(由服务器发送)失败时,它将引发错误400,我希望.catch然后在客户端代码中触发该错误但这不会发生,因为客户端代码继续在该.then部分上运行

我应该怎么做呢?不知道.catch这里使用的方法是否正确,或者我是否应该以其他方式进行此类工作。

TJ人群

您似乎已经意识到fetchAPI中的“步枪” (我在这里写到),fetch只是在网络错误而不是HTTP错误上拒绝了它的承诺,但是您的检查在两种方面是不正确的:

  • status,而不是Status(大写字母很重要),并且

  • 这是HTTP代码(400例如),而不是字符串

Response对象提供了一个方便的ok标志,对于任何成功的响应都适用,false否则,这样:

const response = await fetch(ngrokOrLocalhost + '/confirmmatchrecord', requestOptions)
if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`); // This will be "HTTP error! status: 400" if the HTTP error code is 400
}
const data = await response.json();
return data;

在评论中,您说过:

response['Status']正在检查发送的自定义服务器消息(res.status(400).json({'Status': 'Failure'}),我用它更新了帖子。不确定为什么它没有捕获到该消息。

啊! 好的。它没有被捕获的原因是您正在Response对象上寻找它,但是JSON在响应正文中

我怀疑您Status既然已经知道response.ok并且response.status现在就不想再使用自己的信息,但是如果您确实想将自己的信息作为JSON包含在错误响应中,则可以这样做。您可以这样做:

const response = await fetch(ngrokOrLocalhost + '/confirmmatchrecord', requestOptions)
const data = await response.json(); // Expects JSON in *both* the success response and the error response
if (data.Status === "Failure") {
    throw new Error(`HTTP error! status: ${response.status}`); // This will be "HTTP error! status: 400" if the HTTP error code is 400
}
return data;

但是我会坚持使用内置功能,ok并且只status提供成功/失败的纯信息。但是,如果您想提供更多有关失败的详细信息,这可能会很方便。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何处理异步获取的数据?

来自分类Dev

如何处理异步循环?

来自分类Dev

如何处理getaddrinfo的结果?

来自分类Dev

如何处理PropertySheet的结果?

来自分类Dev

如何处理异步作业的子批次?

来自分类Dev

如何处理组件中的异步输入?

来自分类Dev

异步如何处理Javascript中的变量?

来自分类Dev

异步如何处理封闭的UI?

来自分类Dev

如何处理多个异步方法的运行?

来自分类Dev

Swift中的异步线程-如何处理?

来自分类Dev

异步如何处理Javascript中的变量?

来自分类Dev

异步如何处理封闭的UI?

来自分类Dev

如何处理异步作业的子批次?

来自分类Dev

如何处理异步subshell退出

来自分类Dev

如何处理REST API的异步登录?

来自分类Dev

如何处理加入多个异步CompletableFutures?

来自分类Dev

如何处理对API的异步调用?

来自分类Dev

异步请求后如何处理条件

来自分类Dev

如何处理R中复制的结果?

来自分类Dev

如何处理JavaScript承诺或结果

来自分类Dev

如何处理DownloadManager的不同结果

来自分类Dev

如何处理搜寻框结果?

来自分类Dev

如何处理未知的PHP cURL结果

来自分类Dev

如何处理DataIntegrityViolationException以获取具体原因?

来自分类Dev

如何处理DataIntegrityViolationException以获取具体原因?

来自分类Dev

如何处理异步块Java中的异常

来自分类Dev

角度2:如何处理组件中服务的异步错误?

来自分类Dev

Android-如何处理异步Http崩溃

来自分类Dev

Servlet 3的异步Servlet功能-如何处理耗时的任务