Запрос в блоке catch после отклонения - PullRequest
1 голос
/ 10 июля 2019

Я работаю над приложением в activjs, которое позволяет людям публиковать сообщения с хэштегами, упоминаниями и медиаЯ начинаю сохранять сообщение в БД, после большого количества элементов управления мне нужно удалить сообщение из БД, если произойдет какая-либо ошибка.Вот функции с обещаниями и блоком catch:

        connectDb()
            .then( () => { return savePost() } )
            .then( () => { return postHashtagRoutine() } )
            .then( () => { return iteratePostMedia() } )
            .then( () => { return detectLanguage() } )
            .then( () => { return updatePost() } )
            .then( () => { console.log("pre conn release") } )
            .then( () => { conn.release() } )
            .then( () => { resolve( { success : "done" } )
            .catch( (err) => {
                connectDb()
                    .then( () => { console.log("create post error", err) } )
                    .then( () => { return removePost() } )
                    .then( reject(err) )

            })

Теперь проблема в том, что когда я вызываю reject в postHashtagRoutine (), если какой-то хэштег содержит стоп-слова, блок catch не вызывается и консольlog и функция removePost () не выполняются.

Здесь часть кода, где я вызываю отклонение в postHashtagRoutine ()

     Promise.all(promisesCheckStopwords)
                 .then( () => {
                   if ( stopwordsId.length > 0){
                        reject("stopwordsId in post");
                   }
                 })

1 Ответ

1 голос
/ 10 июля 2019

Вы можете throw в обработчике Thenable отклонить.

Затем вызов вернет отклоненное обещание, если функция выдаст ошибку или вернет отклоненное обещание.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

Я бы предложил использовать throw <result> вместо reject([result]).

Например:

throw "stopwordsId in post"

Я бы также предложил вам перевести второй вызов на connectDb(), чтобы убедиться, что цепочки обещаний связаны друг с другом.

Если onFulfilled возвращает обещание, возвращаемое значение затем будет разрешено / отклонено обещанием.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

Первый блок кода:

    connectDb()
        .then( () => { return savePost() } )
        .then( () => { return postHashtagRoutine() } )
        .then( () => { return iteratePostMedia() } )
        .then( () => { return detectLanguage() } )
        .then( () => { return updatePost() } )
        .then( () => { console.log("pre conn release") } )
        .then( () => { conn.release() } )
        .then( () => { return { success : "done" } )
        .catch( (err) => {
            return connectDb()
                .then( () => { console.log("create post error", err) } )
                .then( () => { return removePost() } )
                .then( throw err )

        })

Второй кодовый блок:

     Promise.all(promisesCheckStopwords)
             .then( () => {
               if ( stopwordsId.length > 0){
                    throw "stopwordsId in post"
               }
             })
...