ES6 Javascript Promise - выполнить после вызова .then ()

Если вы хотите выполнить код после вызова обратного вызова в JavaScript, вы можете просто разместить его после обратного вызова:

function demoCallback(callback) {
  callback()
  console.info("I execute second")
}

demoCallback(() => {
  console.info("I execute first")
})

Можно ли сделать то же самое с ES6 Promise в рамках функции? Скажем, у меня есть функция, которая возвращает обещание:

function demoPromise() {
  return new Promise((resolve, reject) => {
    resolve()
    console.info("I execute first")
  })
}

demoPromise().then(() => { console.info("I execute second") })

Код, вставленный после разрешить, выполняется после разрешения Promise, но передтогда вызывается вне области действия функции. Есть ли способ выполнить код после обоих, но делать это в рамках функции?

Он все равно будет работать, но не обязательно раньше.

Get Off My Lawn 23.07.2018 16:24

На самом деле непонятно, о чем вы здесь спрашиваете, resolve - это то, что вы контролируете, вы решаете, когда выполнять свое обещание, .. Итак, в приведенном выше примере, если вы хотите first / second ,. просто измените порядок console.info("first"); resolve();

Keith 23.07.2018 16:25

Вы можете передать функцию в resolve и вызвать эту функцию в then.

Hikmat G. 23.07.2018 16:30

@Keith, возможно, я поставил неправильный вопрос жирным шрифтом. Я задаю (конкретно) вопрос, выделенный жирным шрифтом внизу. Могу ли я выполнить код после разрешения Promise и вызова .then (), но из области действия функции?

Max K 23.07.2018 16:30
Поведение ключевого слова "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) для оценки ваших знаний,...
4
4
4 773
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете разрешить Promise с помощью функции, которая может быть вызвана в блоке тогда. Пока эта функция вызывается внутри блока, вы можете выполнить код до нее, например

function demoPromise() {
  return new Promise((resolve, reject) => {
    resolve(function(){
        console.info("I execute second")
    });
  })
}

demoPromise().then(f => { console.info("I execute first");f();})

К сожалению, даже этот маленький ;f(); - это слишком много кода :-) - суть диспозера в том, что он очищается независимо от того, что делает вызывающий код; если вызывающий должен не забыть перезвонить, тогда закон Мерфи гласит, что рано или поздно они этого не сделают.

AlexChaffee 25.11.2018 17:16
Ответ принят как подходящий

Is it possible to do the same thing with an ES6 Promise from within the scope of the function?

Нет, это невозможно. Обратные вызовы then всегда выполняются асинхронно, в том числе и в отношении вызова resolve().

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

function demoPromise() {
  const p = new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
      p.then(() => {
        console.info("I execute second");
      }); // because I will be scheduled second
    }, 1000);
  });
  return p;
}

demoPromise().then(() => {
   console.info("I execute first");
}); // because I was scheduled first

Но, пожалуйста, не делай этого)

If you want to execute code after a callback is called in JavaScript

тогда вам, вероятно, не следует просто возвращать обещание. Перед выполнением кода возьмите обратный вызов, который сделает то, что вы хотите:

function demoPromise(callback) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, 1000);
  }).then(() => {
    return callback();
  }).then(res => {
    console.info("I execute second");
  });
}

demoPromise(() => {
   console.info("I execute first");
}).then(() => {
   console.info("I execute last");
});

Это известно как образец измельчителя и очень полезно для обработки ресурсов.

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