Выдает ошибку обработчику catch и игнорирует тогда функции? - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть вспомогательная функция:

function httpRequestHelper(body) {
    return fetch(`${host}:${port}`, {
        method: 'post',
        body: JSON.stringify(body)
    })
    .then(function (response) {
        if (!response.ok) {
            throw Error(response.statusText);
        }
        return response.json();
    })
    .then(function(response) {
        if (response.type === 'error') {
            throw Error(response);
        }
        return response;
    })
    .catch(function(error) {
        return error;
    });    
}

, которую я написал для краткости функций для различных команд.Эти функции просто указывают тело для отправки и какая часть ответа имеет отношение к потребителю:

function hasActiveProject() {
    return httpRequestHelper({ type: 'request', cmd: 'has_active_project' })
    .then(function (response) {
        return response.payload.value;
    })
}

Я выполняю различные команды следующим образом:

try {
    let hasActiveProjectResponse = await otii.hasActiveProject()
    console.log(hasActiveProjectResponse);    
} catch (error) {
    console.log(error);
}

Теперь проблемаявляется то, что в функции catch я ожидал бы получить сообщение об ошибке, но вместо этого я получаю сообщения об ошибках, такие как:

TypeError: Cannot read property 'value' of undefined

Это потому, что hasActiveProject() пытается извлечь соответствующий ответ, даже когда былошибка, которая вызывает другую ошибку, которая возвращается в мой обработчик catch (error).

Как я могу переписать это так, чтобы

  • hasActiveProject() оставался тонким
  • Обработчик перехвата получает исходную ошибку

1 Ответ

0 голосов
/ 16 ноября 2018

Вы уверены, что у вас есть ошибка?и response.payload не является неопределенным?поскольку в этом тестовом скрипте вы видите, что он работает так, как вы хотите, попытка отлавливает ошибки, возникающие в функции .then, и не продолжается.

https://jsfiddle.net/8qe1sxg4/6/

Похоже, response.type является действительным, поэтому у вас нет выданных ошибок, можете ли вы подтвердить полученные результаты?

ОБНОВЛЕНИЕ

После дополнительных исследованийфункция catch не переходит к следующему улову, она выглядит так, как будто вы уже обработали ошибку и продолжаете как обычно (с разрешенным значением из catch).Но вы можете просто отклонить снова внутри .catch (), так что ваша ошибка будет пузыриться в try / catch:

in httpRequestHelper():

.catch(function(error) {
    return Promise.reject(error)
    //return error;
});

Это отправит вашошибка до следующего улова, см. fiddle, например: https://jsfiddle.net/dcuo46qk/3/

...