Я создаю новую тему, потому что я не нашел решения здесь.
Я столкнулся с проблемой с javascript в ionic , в которой я должен вызывать функции, уже определенные мной, в firebase API . Вот моя ситуация:
change(val){
firebase
.auth()
.signInWithEmailAndPassword(this.email,val.old_password)
.then(function(user) {
firebase
.auth()
.currentUser.updatePassword(val.new_password)
.then(function() {
console.log("pass changed");
### here the function to show the message
})
.catch(function(err) {
console.log("an error happend changing pass");
### here the function to show the message
});
})
.catch(function(err) {
console.log("a very bad error happend");
});
}
passwordChanged(){
this.alertCtrl.presentTimeAlert(
"Password changed",
"The process was successful",
"",
2
);
}
passError(){
this.alertCtrl.presentAlert(
"Error",
"An error occurred. \n Retry",
"Okay"
);
}
Моя цель - показать сообщение, если я изменил пароль или нет. Учитывая тот факт, что эта функция асинхронная, я хотел использовать passwordChanged и passError в качестве «обратного вызова», но они undefined в области действия функции firebase. На самом деле все мои переменные и функции находятся в неопределенном месте, где я должен показать сообщение.
Зная тот факт, что я использую библиотеку Firebase, и такое поведение может быть нормальным, есть способ избежать этой проблемы?
Заранее благодарю.
2 ответа
Вы можете попробовать такой подход:
passwordChanged() {
this.alertCtrl.presentTimeAlert(
'Password changed',
'The process was successful',
'',
2
);
}
passError(changeErrors) {
this.alertCtrl.presentAlert(
'Error',
'An error occurred. \n Retry',
'Okay'
);
}
async change(val) {
const changeErrors = [];
///
// Try to login
const tryToLogIn = await firebase.auth().signInWithEmailAndPassword(this.email, val.old_password)
.catch((err) => {
console.error('A very bad error happend', err);
changeErrors.push(err);
return null;
});
if (tryToLogIn) {
///
// Try to update the password
const updatePassword = await new Promise((res) => {
firebase.auth().currentUser.updatePassword(val.new_password)
.then(() => { console.log('Password changed'); res(true); })
.catch((err) => { console.error('An error happend changing pass', err); changeErrors.push(err); res(false); });
});
if (updatePassword) {
// Password was updated
passwordChanged();
} else {
// Password was not updated
passError(changeErrors);
}
}
}
Я думаю, что вы можете достичь своей цели, опубликовав сообщение с источником событий, чтобы вы могли использовать результаты за пределами
Вот пример
import { Events } from 'ionic-angular';
// first page (publish an event when a user is created)
constructor(public events: Events) {}
createUser(user) {
console.log('User created!')
this.events.publish('user:created', user, Date.now());
}
// second page (listen for the user created event after.
function is called)
constructor(public events: Events) {
events.subscribe('user:created', (user, time) => {
// user and time are the same arguments passed in.
`events.publish(user, time)`
console.log('Welcome', user, 'at', time);
});
}
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.