我在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/

10-13 05:56