Я изучаю обещания в 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'));
Когда вызывается обещание, журнал внутри обещания появляется перед журналом Перезвоните:
Почему так происходит? Как сделать, чтобы журнал Внутри обещания был после журнала Перезвоните.
Обещание кажется более естественным подходом к варианту использования OP. Но это не по теме его вопроса.
Спасибо @ Jota.Toledo, что такое ОП?





Трудно сказать, не имея возможности запустить код, Единственное, что я вижу, это то, что ты
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 ()?
IMO, лучше использовать
ObservableвместоPromise. См. Этот пост для получения дополнительной информации: stackoverflow.com/questions/37364973/promise-vs-observable