Возврат значений из цепочки обещаний Javascript

Современный новичок в JS / Promise здесь. Мне трудно найти ответ на простой вопрос, несмотря на огромное количество материалов по этой теме.

Я считаю, что хорошо разбираюсь в JS Promises (благодаря различным источникам, включая mdn и https://spin.atomicobject.com/2016/02/16/how-javascript-promises-work/)

Я регулярно потреблял и создавал обещания в их простейшей форме, однако продолжаю натыкаться на методы в моих унаследованных проектах со следующим шаблоном:

const doAsyncOp = () => 
  $http.get(uri)
    .then(
      value => value,
      reject => //... 
    );

У меня большой вопрос: что произойдет, если вы просто вернете значение из обработчика успеха? Мне нужно использовать этот метод и получить доступ к «значению» в клиентском коде. Это технически необработанное? Стоит ли переписывать реализацию?

Бросьте бессмысленный .then(value => value). Вы можете просто передать null или использовать catch, если хотите обрабатывать только отклонения.
Bergi 02.04.2018 21:26

Прошу прощения, если фрагмент не понятен. Отказ здесь произвольный; Мне нужен доступ к значению в клиентском коде. Возможно ли это с помощью этого кода?

Firephp 02.04.2018 21:28

Если под «клиентом» вы имеете в виду вызывающего абонента, вы возвращаете обещание из своей функции, поэтому вы можете просто использовать doAsyncOp().then(value => /* do whatever you need */).

Bergi 02.04.2018 23:25

Клиентский код, то есть область действия сценария потребителя. Вызывающий является частью клиентского кода. И, да, но что, если реализация уже включает .then (value => value)? Я бы хотел использовать этот метод, не изменяя его, потому что этот тип реализации метода многократно повторяется в проекте. Думаю, кто-то мне это разъяснил. Спасибо хоть!

Firephp 03.04.2018 00:18

Берги, я понял, что вы ответили на мой вопрос; Мне просто нужно было доработать. jfriend00 помог мне это прояснить. Ваше здоровье!

Firephp 03.04.2018 00:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
1 086
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Чтобы передать это в клиентский код, просто верните обещать из вашей функции:

const doAsyncOp = () => $http.get(uri)

то в своем клиенте вы можете использовать:

doAsyncOp()
.then(value => {
    // use value
}
.catch(err => { /* error */  }
Ответ принят как подходящий

My big question is: What happens when you simply return a value from your success handler?

Когда вы возвращаете значение из обработчика .then(), это значение становится разрешенным значением родительской цепочки обещаний: Итак, в этом коде:

// utility function that returns a promise that resolves after a delay
function delay(t, v) {
    return new Promise(resolve => {
        setTimeout(resolve.bind(null, v), t);
    });
}

function test() {
    return delay(100, 5).then(val => {
        // this return value becomes the resolved value of the promise chain
        // that is returned from this function
        return 10;
    });
}

test().then(result => {
    // logs 10
    console.info(result);
});

Когда вы запустите его, он будет записывать 10 из-за return 10 в обработчике .then().

У обработчика .then() есть четыре возможности:

  1. Вернуть обычное значение, такой как return 10 или return val. Это значение становится разрешенным значением цепочки обещаний. Если значение не возвращается (что в Javascript означает, что возвращаемое значение - undefined), то разрешенное значение цепочки обещаний - undefined.

  2. Верните обещание, которое в конечном итоге выполняется или уже выполнено. Это обещание добавляется в цепочку, и цепочка обещаний принимает разрешенное значение этого обещания.

  3. Верните обещание, которое в конечном итоге отклоняется или уже отклонено. Это обещание добавляется в цепочку, и цепочка обещаний принимает на себя отклоненную причину возвращенного обещания.

  4. Выбросить исключение. Если в обработчике .then() возникает исключение, инфраструктура .then() перехватит его и переведет цепочку обещаний в состояние отклонения, при этом для причины отклонения установлено значение, которое генерируется. Итак, если вы выполняете throw new Error("User not found") внутри обработчика .then(), тогда эта цепочка обещаний будет отклонена с этим объектом ошибки в качестве причины отклонения.


В вашем конкретном коде:

const doAsyncOp = () => 
  $http.get(uri)
    .then(
      value => value,
      reject => //... 
    );

Нет причин для value => value. value уже является разрешенным значением обещания, вам не нужно устанавливать его снова.

А поскольку функция жирной стрелки автоматически возвращает любой отдельный оператор, вы уже возвращаете обещание от $http.get().then() в своей функции doAsyncOp(). Итак, вы можете просто сделать:

const doAsyncOp = () => $http.get(uri);

doAsyncOp().then(result => {
   // handle the result here
}).catch(err => {
   // handle error here
});

Ваше здоровье!! Теперь это имеет смысл.

Firephp 03.04.2018 00:25

Я думаю, вы можете использовать async и ждать разрешенных значений.

function delay(t, v) {
    return new Promise(resolve => {
        setTimeout(resolve.bind(null, v), t);
    });
}

async function(){
    await myData = delay(1000, 1000);

    console.info(myData);
}

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