我在Angular2 / firebase端项目上工作,并在这段代码上停了一段时间。我要在这里执行的操作是使用signupUser方法创建一个新帐户,然后仅在成功后才调用另一个方法saveNewUserInDatabase。如果我像下面那样做,则router.navigate方法不会等待5秒钟。
//EXAMPLE 1
public onSignup(): void {
this.authService.signupUser(this.signupForm.value)
.then(response => {
let userObject = {
uid: response.auth.uid,
email: response.auth.email
};
setTimeout(() => this.authService.saveNewUserInDatabase(userObject) , 5000)})
.then(() => {
setTimeout(() => { this.router.navigate(['/map'])}, 1500);
})
.catch(error => {
console.log(error);
});
}
但是,如果像下面的示例一样嵌套.then方法,则它可以按我希望的方式工作。
//EXAMPLE 2
public onSignup(): void {
this.authService.signupUser(this.signupForm.value)
.then(response => {
let userObject = {
uid: response.auth.uid,
email: response.auth.email
};
setTimeout(() => this.authService.saveNewUserInDatabase(userObject)
.then(() => {
setTimeout(() => { this.router.navigate(['/map'])}, 1500);
}
), 5000)
})
.catch(error => {
console.log(error)
});
}
服务方法
public signupUser(user: UserLogin): firebase.Promise<FirebaseAuthState> {
return this.af.auth.createUser({email : user.email, password: user.password});
}
public saveNewUserInDatabase(user): firebase.database.ThenableReference {
return firebase.database().ref().child("users").push(user);
}
第二种解决方案有效(用户在5秒后导航到/ map路径)。但是,我不认为将诺言嵌套在诺言中不是一种好习惯。我如何在这里链接承诺
.then()
.then()
并让第二个。然后在第一个完成后触发?
感谢您的帮助。
最佳答案
要执行您想要的操作,您需要先返回一个承诺,然后:
public onSignup(): void {
this.authService.signupUser(this.signupForm.value)
.then(response => new Promise(function (resolve, reject) {
let userObject = {
uid: response.auth.uid,
email: response.auth.email
};
setTimeout(() => resolve(this.authService.saveNewUserInDatabase(userObject)), 5000)
})
.then( () => {
setTimeout(() => { this.router.navigate(['/map'])}, 1500)
})
.catch(error => {
console.log(error)
});
}
关于javascript - javascript如何以更优雅的方式 promise 链接?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40062465/