Javascript 角度2等待承诺和可观察到的解决方案

Javascript 角度2等待承诺和可观察到的解决方案,javascript,angular,typescript,promise,observable,Javascript,Angular,Typescript,Promise,Observable,在我的accountService中,我有一个对话框,要求用户输入用户名/密码,并返回一个承诺。如果他们单击close而不是Disclose,并且验证器在单击close之前需要数据,那么我希望使用返回可观察数据的数据登录 loginModal() : boolean { this.dpDialogService.input( 'Login', [ { label: 'Username/Email',

在我的accountService中,我有一个对话框,要求用户输入用户名/密码,并返回一个承诺。如果他们单击close而不是Disclose,并且验证器在单击close之前需要数据,那么我希望使用返回可观察数据的数据登录

loginModal() : boolean {

    this.dpDialogService.input(
        'Login',
        [
            {
                label: 'Username/Email', 
                form: 'username', 
                data: '', 
                validators: [Validators.required],
                validatorMsg: 'Username is required.'
            },
            {
                label: 'Password', 
                form: 'password', 
                data: '', 
                validators: [Validators.required],
                validatorMsg: 'Password is required.',
                type: 'password'
            },
        ]
    ).then(
        close => {
            this.login({username: close.username.value, password: close.password.value}).subscribe(
                loginResult => {
                    return true;
                },
                errorResult => {
                    this.dpDialogService.error('Invalid username/password.');
                    return false;
                }
            )
        },
        dismiss => {
            return false;
        }
    );
}

如何从函数中返回此布尔值。我猜我必须使用承诺,但不确定它们是如何嵌套的。

如果
.subscribe
没有返回承诺,那么您需要创建一个承诺,该承诺根据
的结果解析为true/false。subscribe

我假设返回的承诺需要始终解决,而不是拒绝(基于
discouse=>
code)

).then(
    close => {
        return new Promise((resolve, reject) => {
            this.login({username: close.username.value, password: close.password.value}).subscribe(
                loginResult => {
                    resolve(true);
                },
                errorResult => {
                    this.dpDialogService.error('Invalid username/password.');
                    resolve(false);
                }
            )
        })
    },
    dismiss => {
        return false;
    }
);

以下是答案,感谢Jaromanda X的帮助

loginModal() : Promise<boolean> {

    return new Promise((resolve, reject) => {
        this.dpDialogService.input(
            'Login',
            [
                {
                    label: 'Username/Email', 
                    form: 'username', 
                    data: '', 
                    validators: [Validators.required],
                    validatorMsg: 'Username is required.'
                },
                {
                    label: 'Password', 
                    form: 'password', 
                    data: '', 
                    validators: [Validators.required],
                    validatorMsg: 'Password is required.',
                    type: 'password'
                },
            ]
        ).then(
            close => {
                this.login({username: close.username.value, password: close.password.value}).subscribe(
                    loginResult => {
                        resolve(true);
                    },
                    errorResult => {
                        this.dpDialogService.error('Invalid username/password.');
                        resolve(false);
                    }
                )
            },
            dismiss => {
                resolve(false);
            }
        );
    });
loginModal():承诺{
返回新承诺((解决、拒绝)=>{
this.dpDialogService.input(
“登录”,
[
{
标签:“用户名/电子邮件”,
表格:'用户名',
数据:“”,
验证器:[验证器。必需],
validatorMsg:“需要用户名。”
},
{
标签:“密码”,
表格:'密码',
数据:“”,
验证器:[验证器。必需],
validatorMsg:'需要密码',
键入:“密码”
},
]
).那么(
关闭=>{
this.login({username:close.username.value,password:close.password.value})。订阅(
loginResult=>{
决心(正确);
},
errorResult=>{
此.dpDialogService.error('无效的用户名/密码');
决议(假);
}
)
},
解雇=>{
决议(假);
}
);
});

因此,您了解
中的代码。然后(close=>{
没有返回任何东西是的,这就是我想弄明白的,我想要嵌套调用的组合结果。
我想要嵌套调用的组合结果
-嗯,不确定你的意思…组合结果表明至少两个结果变成一个…抱歉,最初的几个输入错误…等等…Angual2的意思是coffeescript…我的答案可能有误导性,因此如果调用函数如下所示:this.accountService.loginModal(),我希望能够拥有此.accountService.loginModal()。然后(…)并且知道他们是否输入了正确的信息并成功登录。所以我需要一个从整个函数返回的承诺。我真正关心的是布尔返回,但它必须是等待两个嵌套异步函数正确的承诺?我使用的是typescript