Обеспечение определенных шагов в цепочке обещаний или прекращении цепочки на ранней стадии - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь синхронизировать c некоторые данные базы данных с локальными данными. В частности, я хочу «загрузить» LinkTable из базы данных (сама функция загрузки обрабатывает объединение данных), а затем ПОСЛЕ функции загрузки я хочу отправить LinkTable в базу данных. Когда это будет сделано, желаемым результатом будет то, что база данных и локальные версии LinkTable будут идентичны. Чтобы усложнить ситуацию, функция загрузки может отклонить приемлемыми способами ... и мне нужно продолжить цепочку обещаний, если это так.

Наконец, после синхронизации LinkTable ... Мне нужно выполнить дополнительные задачи, которые основаны на упомянутой LinkTable.

Я использую реагирование / избыточность, но вопрос больше в обещаниях.

Соответствующий (неудачный) код выглядит следующим образом:

     dispatch(loadLinkTableFromDB(username))
            .then((successLoadLinkTableMsg) => {
                console.log('Successfully loaded link table: ', successLoadLinkTableMsg)
                return dispatch(pushLinkTableToDB(username))
            })
            .catch((rejectLoadLinkTableReason) => {
                console.log("Failed to load link table from DB: " + rejectLoadLinkTableReason);
                if (allReasonsAcceptableForOverwrite(rejectLoadLinkTableReason)) {  // some rejection reasons are accectable... so if failed reason is okay.... 
                    return dispatch(pushLinkTableToDB(username));
                } else {
                    // console.log("Rejecting: ", rejectLoadLinkTableReason);
                    return Promise.reject(rejectLoadLinkTableReason); 
                }
            })
            .catch((unacceptableRejectionReasons) => {
                console.log('unacceptableRejectionReasons :', unacceptableRejectionReasons);
            })
            .then(( *do more stuff that relies on the LinkTable *))

Моя проблема в том, что недопустимый отказ в загрузке LinkTable ... И любой отказ в толкании таблицы ссылок из первого перехвата в конечном итоге перехватывается вторым поймать. Когда это неприемлемое отклонение, я хочу, чтобы вся цепочка обещаний закончилась. Когда это приемлемое отклонение, а затем последующее отклонение в pushLinkTableToDB ... Я хочу, чтобы цепочка обещаний продолжалась.

1 Ответ

2 голосов
/ 15 января 2020

Вы захотите использовать .then(…, …) вместо .then(…).catch(…) только для обработки отклонений от loadLinkTableFromDB, но не от pushLinkTableToDB:

dispatch(loadLinkTableFromDB(username))
.then(loadLinkTableResultMsg) => {
    console.log('Successfully loaded link table: ', loadLinkTableResultMsg)
    return dispatch(pushLinkTableToDB(username))
}, loadLinkTableErrorReason => {
    console.log('Failed to load link table from DB: ', loadLinkTableErrorReason);
    if (allReasonsAcceptableForOverwrite(loadLinkTableErrorReason)) {
        return dispatch(pushLinkTableToDB(username));
    } else {
        throw loadLinkTableErrorReason; 
    }
})
.then( /* do more stuff that relies on the LinkTable */ )
.catch(unacceptableRejectionReasons => {
    console.log('unacceptableRejectionReasons :', unacceptableRejectionReasons);
})

Однако, учитывая вы хотите pushLinkTableToDB в обоих случаях, вы можете захотеть переместить это вниз по цепочке и удалить дублирование:

dispatch(loadLinkTableFromDB(username))
.then(loadLinkTableResultMsg) => {
    console.log('Successfully loaded link table: ', loadLinkTableResultMsg)
}, loadLinkTableErrorReason => {
    console.log('Failed to load link table from DB: ', loadLinkTableErrorReason);
    if (!allReasonsAcceptableForOverwrite(loadLinkTableErrorReason)) {
        throw loadLinkTableErrorReason; 
    }
})
.then(() => dispatch(pushLinkTableToDB(username)))
.then( /* do more stuff that relies on the LinkTable */ )
.catch(unacceptableRejectionReasons => {
    console.log('unacceptableRejectionReasons :', unacceptableRejectionReasons);
})

Без сообщений журнала вы также можете использовать только catch - вы просто необходимо поместить его перед вызовом pushLinkTableToDB:

dispatch(loadLinkTableFromDB(username))
.catch(loadLinkTableErrorReason => {
    if (!allReasonsAcceptableForOverwrite(loadLinkTableErrorReason)) {
        throw loadLinkTableErrorReason; 
    }
})
.then(() => dispatch(pushLinkTableToDB(username)))
.then( /* do more stuff that relies on the LinkTable */ )
.catch(unacceptableRejectionReasons => {
    console.log('unacceptableRejectionReasons :', unacceptableRejectionReasons);
})

Если вы управляете функцией loadLinkTableFromDB, вы можете даже подумать о перемещении вызова catch внутри этой функции, чтобы возвращаемое обещание только отклоняется с недопустимыми ошибками и в противном случае соответствует приемлемым результатам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...