Angular-承诺回电

时间:2018-10-06 05:06:01

标签: angular rxjs es6-promise

我在Angular中学习诺言。

我有这个功能:

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

在方法cognitoUtil.updateAtributes内,有一个被调用的方法,执行这些方法后,日志为 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 :(得分:0)

如果不运行代码就很难说, 我唯一能看到的是您的

IGNORECASE

不会立即运行,只是被传递到

console.log("callback")

在传递给

的函数中运行
cognitoUser.updateAttributes(attributeList, function (error, result) {

必须以某种方式异步运行该功能,而不要等待.then()

以回调为例,例如

cognitoUser.getSession(function (err, session) {

在单击元素之前永远不会显示。

答案 1 :(得分:0)

您的诺言立即得到解决,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