Javascript 承诺链中获取类型错误的检测

Javascript 承诺链中获取类型错误的检测,javascript,Javascript,目前,我正在使用fetch和redux thunk从API读取代码- 我的代码如下所示: export function getUsers() { return (dispatch) => { // I have some helper code that automatically resolves the json promise return fetch(`/users`) .then((resp, json) => { if (resp

目前,我正在使用fetch和redux thunk从API读取代码-

我的代码如下所示:

export function getUsers() {
  return (dispatch) => {
    // I have some helper code that automatically resolves the json promise
    return fetch(`/users`)
    .then((resp, json) => {
      if (resp.status === 200) {
        dispatch(getUsersSuccess(json));
      } else {
        dispatch(getUsersFail(json));
      }
    }).catch((err) => {
      // network error
      dispatch(getUsersFail(err));
    });
  };
}
这里的问题是
catch
方法,因为它将
catch
then
块中抛出的任何错误。这通常意味着,如果某个React组件的渲染函数因程序员错误而失败,则该错误会被重新写入
调度(getUsersFail(err))

理想情况下,我希望检测
err
是否为获取错误(并分派我自己的操作),否则抛出。但是,fetch会抛出一个通用的
类型错误。如何可靠地检测到捕获的错误是由fetch抛出的错误?

不要使用
.catch()
,而是直接在fetch承诺上安装错误处理程序,作为
的第二个-onreject-参数。然后()

有关详细信息,请查看

顺便说一句,我建议你写信

return fetch(`/users`)
.then(([resp, json]) => resp.status === 200 ? getUsersSuccess(json) : getUsersFail(json)
     , getUsersFail)
.then(dispatch);

您使用的promise实现将两个参数传递给
然后
回调?我的“fetch”函数实际上是window.fetch-
f(u,opts)。然后(res=>promise.all([res,isJson(res)→res.json():{}])
。它实际上并没有传递2个参数,而是传递一个数组参数,我使用扩展操作符展开
([resp,json])=>
啊,我想是这样的。顺便说一下,您可能需要考虑添加<代码>如果(.R.OK)返回RS.jONE()。然后(JSON= > {抛出JSON})<代码>到您的包装器中,这样您就不必在 GueSuth函数中检测状态代码,而可以只写“代码> FETCH(‘用户’)。然后(GETUSSRESWORKE,GETUSSRSHIVE)。然后(调度)
但是,我想捕获Fetch抛出的错误。例如,如果我们的API关闭,或者如果用户的internet不稳定,我想将该错误告知用户。然而,我发现调用'dispatch(GetUsersAccess(json))`可以出于任何原因抛出错误(例如,如果React组件在代码的不同部分抛出错误,而render方法在这个链中),我仍然希望能够抛出这些错误。@killachaos这正是我答案中的代码所做的。我的错误,我并没有真正测试你的代码。您的链接提到这是一个反模式,但我不确定是否应该忽略它-因为我确实希望避免捕获与该代码块无关的错误。@killachaos链接问题的答案解释了为什么(当)它不是反模式:-)您认为如何先指定捕获?i、 e.
fetch(u).catch(err=>networkFail(err)).then(getuserssaccess)
对于需要在分派之前进行一些预处理的回调,它看起来很笨拙,但可读性比
then(s,f)
强。我唯一关心的是,它看起来不太地道,也不清楚为什么顺序在这里很重要。
return fetch(`/users`)
.then(([resp, json]) => resp.status === 200 ? getUsersSuccess(json) : getUsersFail(json)
     , getUsersFail)
.then(dispatch);