【问题标题】:Angular 2 waiting for promise and observable to resolveAngular 2 等待 promise 和 observable 解决
【发布时间】:2017-01-15 03:24:19
【问题描述】:

在我的 accountService 中,我有一个对话框询问用户用户名/密码,它返回一个承诺。如果他们单击关闭而不是关闭,并且验证器在单击关闭之前需要数据,那么我想使用返回可观察的数据登录。

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;
        }
    );
}

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

【问题讨论】:

  • 所以,您知道.then(close => { 中的代码没有返回任何内容
  • 是的,这就是我想要弄清楚的,我想要嵌套调用的组合结果。
  • I want a combined result from the nested calls - 嗯,不知道你的意思是什么……综合结果表明至少有两个结果合二为一……

标签: javascript angular typescript promise observable


【解决方案1】:

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

我假设返回的承诺需要始终解决,从不拒绝(基于 dismiss => 代码

).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;
    }
);

【讨论】:

  • 抱歉,原来有几个错别字
  • 哦等等……angualr2 的意思是coffeescript……我的回答可能有误导性
  • 所以如果调用函数是这样的:this.accountService.loginModal(),我希望能够拥有this.accountService.loginModal().then(...)并知道他们是否输入正确的信息并成功登录。所以我需要一个从整个函数返回的promise
  • 我真正关心的是布尔返回,但它必须是等待两个嵌套异步函数正确的承诺?
  • 我正在使用打字稿
【解决方案2】:

这是答案,感谢 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);
            }
        );
    });

【讨论】:

    猜你喜欢
    • 2018-03-26
    • 2017-11-16
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多