Угловой - Обещания с обратным звонком - PullRequest
0 голосов
/ 06 октября 2018

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

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

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

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

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.log("callback");
  });

});

}

Обещание вызывается следующим образом:

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

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

enter image description here

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Ваше обещание разрешается немедленно, код внутри конструктора 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.log('Inside the promise')); // <-- should work
0 голосов
/ 06 октября 2018

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

console.log("callback")

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

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

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

cognitoUser.getSession(function (err, session) {

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

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

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

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

...