Angular - Обещания с обратным звонком

Я изучаю обещания в Angular.

У меня есть такая функция:

  myFunction(): Promise<any> {
    return new Promise(resolve => {
      resolve(this.cognitoUtil.updateAtributes(this.id, this.userProfileForm));
    });
  }

Внутри метода cognitoUtil.updateAtributes есть методы, которые вызываются, и у меня есть журнал console.info ("обратный вызов") после выполнения методов:

updateAtributes(id: string, user: UserForm) {

const cognitoUser = this.getCurrentUser();
cognitoUser.getSession(function (err, session) {
  if (err) {
    return;
  }
  const attributeList = [];
  const dataName = {
    Name: 'name',
    Value: user.name
  };
  const dataEmail = {
    Name: 'email',
    Value: user.email
  };
  attributeList.push(new CognitoUserAttribute(dataName));
  attributeList.push(new CognitoUserAttribute(dataEmail))
  cognitoUser.updateAttributes(attributeList, function (error, result) {
    if (error) {
      alert(err);
      return;
    }
    console.info("callback");
  });

});
} 

Обещание вызывается так:

this.myFunction().then(() => console.info('Inside the promise'));

Когда вызывается обещание, журнал внутри обещания появляется перед журналом Перезвоните:

Angular - Обещания с обратным звонком

Почему так происходит? Как сделать, чтобы журнал Внутри обещания был после журнала Перезвоните.

IMO, лучше использовать Observable вместо Promise. См. Этот пост для получения дополнительной информации: stackoverflow.com/questions/37364973/promise-vs-observable

Edric 06.10.2018 07:32

Обещание кажется более естественным подходом к варианту использования OP. Но это не по теме его вопроса.

Jota.Toledo 06.10.2018 10:46

Спасибо @ Jota.Toledo, что такое ОП?

AleGallagher 06.10.2018 22:10
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
3
275
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Трудно сказать, не имея возможности запустить код, Единственное, что я вижу, это то, что ты

console.info("callback")

не будет запущен немедленно, он просто передается в

cognitoUser.updateAttributes(attributeList, function (error, result) {

который запускается в функции, переданной в

cognitoUser.getSession(function (err, session) {

каким-то образом это должно запускать эту функцию async и не ждать .then ()

возьмем, например, обратный вызов, такой как

.click(function() { console.info('click') }); 

который никогда не появится, пока элемент не будет нажат.

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

ваше обещание выполняется немедленно, код внутри конструктора Promise синхронный (там нет ожидания, откладывать нечего)

вот почему ваше обещание немедленно выполняется в тот же момент, когда вы его вызываете

там в первую очередь нет необходимости в обещаниях, просто делайте то, что вы делаете, без обещаний, и вы получите это прямо

ОБНОВИТЬ: похоже, что updateAttributes вызывает свой обратный вызов в случайное время, которое происходит после обратного вызова then

если вы хотите понять это прямо, вам нужно обернуть свой вызов updateAttributes в обещание:

myFunction(): Promise<any> {
    return wrappedUpdateAttributes(this.id, this.userProfileForm);
}

function wrappedUpdateAttributes(id, cognitoUser) {
   // ...
   return new Promise(resolved => {
      cognitoUser.updateAttributes(attributeList, function (error, result) {
          // ...
          resolve(undefined);
      })
   });

}

this.myFunction().then(() => console.info('Inside the promise')); // <-- should work

Спасибо за ответ @ Алексей Быков! Итак, чтобы убедиться, что я хорошо понял. "then" метод Promise выполняется после того, как Promise вызывает метод resolve ()?

AleGallagher 06.10.2018 08:06

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