异步等待+ toPromise挂起

时间:2018-10-01 14:35:56

标签: angular stripe-payments

我正在使用ngx-stripe,并且createToken返回一个Observable,我尝试将其转换为Promise,以便可以使用Async / await。但是,诺言似乎没有解决。调试不会显示任何内容,而我的try / Catch块也不会捕获任何错误。

我想知道我是否正确使用了toPromise:

N   |   HEX |   ASC
1       52      R
2       38      8
3       38      8   
4       41      A

编辑

调试器-如果有帮助。这是最后一个控制台输出:

  

创建银行帐户令牌{国家:“ AU”,货币:“ aud”,account_holder_name:“某人名称”,account_holder_type:“个人”,account_number:“ 000123456”,...}

enter image description here

*************************编辑********************* ** 我不确定为什么,但是当我创建一个Stackblitz时,代码就起作用了。

然后我比较了stackblitz中的库,并更新了我的angular,rxjs,rxjs-compat以匹配stackblitz中的内容,然后再次尝试,得到的结果与以前相同。

然后我删除了toPromise()并将其更改为:

import {
    Elements,
    Element as StripeElement,
    ElementsOptions,
    BankAccountData,
    StripeService
} from 'ngx-stripe';

constructor(
    public stripeService: StripeService,

) {}



async next() {
    let token: any;
    let account: BankAccountData = {
        country: this.country,
        currency: this.currency,
        account_holder_name: this.first_name + " " + this.last_name,
        account_holder_type: this.type,
        account_number: account_number,
        routing_number: routing_number
    };

    console.log("--> Creating Bankaccount Token", account);

    try {
        token = await this.stripeService.createToken("bank_account", account).toPromise();
    } catch (excep) {
        console.log(excep);
    }

    console.log("-->Token Generated : ", token);
}

与stackblitz相比,我不确定是什么限制了我的项目。我不确定如何解决问题所在,我唯一能想到的就是从头开始重建项目。

1 个答案:

答案 0 :(得分:5)

尝试执行.pipe(take(1))。toPromise()。

请参阅内部代码中有关rxjs的逻辑。 “解析”仅在完成时被调用(请参见下面的代码)。因此,取决于您的可观察对象的工作方式,您可能无法获得分辨率。但是,即使可观察到的对象不完整,也会在每次发射值时调用订阅,这就是订阅工作的原因。 “ take(1)”将导致完成,因此应该称呼您的诺言。

这是该函数的rxjs代码。

Observable.prototype.toPromise = function (PromiseCtor) {
    var _this = this;
    if (!PromiseCtor) {
        if (_root.Rx && _root.Rx.config && _root.Rx.config.Promise) {
            PromiseCtor = _root.Rx.config.Promise;
        }
        else if (_root.Promise) {
            PromiseCtor = _root.Promise;
        }
    }
    if (!PromiseCtor) {
        throw new Error('no Promise impl found');
    }
    return new PromiseCtor(function (resolve, reject) {
        var value;
        _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); });
    });
};