none
JS промисы RRS feed

  • Вопрос

  • Есть сторонняя функция обещания, назовем её foo, есть два метода f2 и f3 - которые передаются в ветки then и catch соответственно. Как правильно написать функцию f1, которая вернет значение из функций f2 или f3?

    function f1() {
        return foo()
          .then(f2)
          .catch(f3);    
    }
    
    function f2(e) {
        return "Yes";    
    }
    
    function f3(e) {
        return "No";    
    }

    В таком варианте функция f1 возвращает значение, что промис выполнен, но его результат еще не доступен, так как функции f2 и f3 еще не отработали. Как правильно написать код?

    P.S. В JS не разбираюсь, поэтому сильно за вопрос не пинайте...

    21 февраля 2019 г. 5:02

Ответы

  • Кстати, рекомендую использовать TS. Тогда все это приобретает куда более цивильный вид:

        public async f1(): Promise<string> {
            try {
                await foo();
                return f2();
            }
            catch (e){            
            }
    
            return f3();
        }
    


    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа Liliya Muray 22 февраля 2019 г. 7:09
    22 февраля 2019 г. 2:37
    Модератор
  • function f1() {
        return new Promise(function(resolve, reject) {
            foo().then(resolve(f2())).catch(resolve(f3()));
        };
    }
    Примерно так...



    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа Liliya Muray 22 февраля 2019 г. 7:09
    21 февраля 2019 г. 21:36
    Модератор

Все ответы

  • Есть сторонняя функция обещания, назовем её foo, есть два метода f2 и f3 - которые передаются в ветки then и catch соответственно. Как правильно написать функцию f1, которая вернет значение из функций f2 или f3?

    function f1() {
        return foo()
          .then(f2)
          .catch(f3);    
    }
    
    function f2(e) {
        return "Yes";    
    }
    
    function f3(e) {
        return "No";    
    }

    В таком варианте функция f1 возвращает значение, что промис выполнен, но его результат еще не доступен, так как функции f2 и f3 еще не отработали. Как правильно написать код?

    P.S. В JS не разбираюсь, поэтому сильно за вопрос не пинайте...

    Надо создать еще один промис который будет возвращать строку. Затем этот промис будет ресолвится в then() и catch() первого промиса с возвратом нужного значения.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    21 февраля 2019 г. 16:11
    Модератор
  • Надо создать еще один промис который будет возвращать строку. Затем этот промис будет ресолвится в then() и catch() первого промиса с возвратом нужного значения.
    Не сочтите за наглость, но можете привести готовый код, пожалуйста...
    21 февраля 2019 г. 16:25
  • function f1() {
        return new Promise(function(resolve, reject) {
            foo().then(resolve(f2())).catch(resolve(f3()));
        };
    }
    Примерно так...



    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа Liliya Muray 22 февраля 2019 г. 7:09
    21 февраля 2019 г. 21:36
    Модератор
  • Кстати, рекомендую использовать TS. Тогда все это приобретает куда более цивильный вид:

        public async f1(): Promise<string> {
            try {
                await foo();
                return f2();
            }
            catch (e){            
            }
    
            return f3();
        }
    


    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа Liliya Muray 22 февраля 2019 г. 7:09
    22 февраля 2019 г. 2:37
    Модератор
  • function f1() {
        return new Promise(function(resolve, reject) {
            foo().then(resolve(f2())).catch(resolve(f3()));
        };
    }
    Примерно так...

    Я не заострила внимание на том, что функции f2 и f3 принимают параметры результата выполнения промиса foo. Для проверки натыкала в код alert'ы, чтоб видеть последовательность выполнения и увидела, что код alert'ы из функции f2 выполняются позже чем срабатывает alert с результатом. Но в целом я поняла направление куда копать... Вот код который получился после небольших исправлений:

    async function f1() {
        return await new Promise(function (resolve, reject) {
            foo().then(x2 => resolve(f2(x2))).catch(er3 => resolve(f3(er3)));
        });
    }
    Спасибо за помощь. Ваша подсказка про библиотеку CefSharp, тоже очень помогла. То, что почитала про TS интересно, но я совершенно не знаю JS и переход на TS думаю вряд ли станет легким ;-) Но как только появится время, попробую изучить TS, еще раз спасибо за помощь!

    22 февраля 2019 г. 7:09