Условная цепочка обещаний не работает

Я использую React с Typescript и имею эту функцию:

const saveData = (): Promise<any> => {
        const promise = new Promise((s:any,f:any) => s(true))

        if (true) {
            promise.then(() => 5)
        }

        return promise
}

Затем я передаю его как свойство обработчика какому-то компоненту:

<Component save = {() => {saveData().then(a => console.info)}}

Это всегда регистрирует true, когда вместо этого следует регистрировать 5, почему? как мне эффективно связать эти обещания. что я здесь делаю не так?

Это пример codeandbox.io:

https://codesandbox.io/embed/practical-montalcini-5njyg

Попробуйте return promise.then(...)

fjc 09.07.2019 14:29

не получилось, все равно получаю true в console.info

danielrvt 09.07.2019 14:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
2
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

then не изменяет обещание, на котором оно вызывается, оно возвращает новое обещание, которое вы игнорируете. Либо сохраните его обратно в promise, либо верните напрямую.

const saveData = (): Promise<any> => {
        const promise = new Promise((s:any,f:any) => s(true))

        if (true as boolean) { // as boolean to make ts not complain about unreachable code
            return promise.then(() => 5)
        }

        return promise
}

Также рассмотрите возможность использования async/await с промисами, что значительно улучшит кодирование:

const saveData = async (): Promise<any> => {
        await Promise.resolve();

        if (Math.random() > 0.5) {
            return 5
        }
        return 0;
}

Другие вопросы по теме