我正在使用ngx-stripe,并且createToken返回一个Observable,我尝试将其转换为Promise以便可以使用Async/await。但是, promise 似乎没有解决。调试不会显示任何内容,而我的try/Catch块也不会捕获任何错误。
我想知道我是否正确使用了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时,代码就起作用了。
然后,我比较了stackblitz中的库,并更新了我的angular,rxjs,rxjs-compat以匹配stackblitz中的内容,然后再次尝试,得到的结果与以前相同。
然后,我删除了toPromise()并将其更改为:
this.stripeService.createToken("bank_account", account).subscribe(data => {
console.log(data);
});
与stackblitz中的内容相比,我不确定是什么限制了我的项目。我不确定如何解决问题所在,我唯一能想到的就是从头开始重建项目。
最佳答案
尝试执行.pipe(take(1))。toPromise()。
请参阅内部代码中有关rxjs的逻辑。 “解决”仅在完成时被调用(请参见下面的代码)。因此,根据可观察的工作方式,您可能无法获得分辨率。但是,即使可观察到的对象不完整,也会在每次发射值时调用该订阅,这就是您的订阅起作用的原因。 “take(1)”将导致完成,因此应该称呼您的 promise 。
这是该函数的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); });
});
};
关于angular - 异步等待+ toPromise挂起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52593442/