我在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'));
调用诺言时,诺言内的日志出现在日志回调之前:
您能解释一下为什么会这样吗? 如何在日志回调之后将日志放在承诺内。
谢谢!
答案 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