невозможно исправить ошибку необработанного отказа - - PullRequest
0 голосов
/ 23 января 2020

Я старался изо всех сил, чтобы найти ошибку. Я использую улов для обработки ошибок, хотя. Может ли кто-нибудь указать, что я делаю неправильно?

const get = (query: Query) => {
    return new Promise((onSuccess, onFailure) => {
        console.log(query.url())
        fetch(query.url(), {
            method: 'GET',
            headers: new Headers(),
            mode: 'no-cors'
        })
        .then(response => {
            if (!response.ok) { throw Error(response.statusText) }
            onSuccess(response.json())
        }, error => onFailure({error})
        ).catch(e => onFailure(e))
    })
}

unhandled rejection erro

1 Ответ

0 голосов
/ 23 января 2020

Во-первых, вы должны вернуть свой запрос на выборку в своем Promise.

Также, возможно, я ошибаюсь, но эта обработка ошибок очень необходима:

   }, error => onFailure({error})

У вас уже есть:

).catch(e => onFailure(e))

Я думаю, что вы можете проверить это так:

const get = (query: Query) => {
   return new Promise((resolve, reject) => {
        //Is query.url() a request ? it can be the one which failed also.
        return fetch(query.url(), {
            method: 'GET',
            headers: new Headers(),
            mode: 'no-cors'
        })
        .then(response => {
            if (!response.ok) { 
               throw Error(response.statusText) 
            }
            return resolve(response.json())
        })
        .catch(e => reject(e))
    })
    // And also if the child request failed, your parent Promise will fail so you have to catch it well
    .catch(e => {console.log(e)})
}

РЕДАКТИРОВАТЬ: Я что-то забыл, если вы используете throw в обратном вызове ребенка, это не будет работать наверняка каждый раз, так что, возможно, .catch после throw никогда не вызывается, попробуйте использовать reject вместо throw.

Например:

const get = (query: Query) => {
   return new Promise((resolve, reject) => {
        //Is query.url() a request ? it can be the one which failed also.
        return fetch(query.url(), {
            method: 'GET',
            headers: new Headers(),
            mode: 'no-cors'
        })
        .then(response => {
            if (!response.ok) { 
               reject(response.statusText) 
            }
            return resolve(response.json())
        })
        .catch(e => reject(e))  //the catch will be triggered
    })
    // And also if the child request failed, your parent Promise will fail so you have to catch it well
    .catch(e => {console.log(e)})
}

Если вы есть вопросы, не стесняйтесь. Надеюсь, это поможет вам ^^

...