如果我使用ng2 http提供程序Observable.toPromise()支持调用启用promise的方法,它会按预期工作,但是当我将它作为promise链的一部分使用时,它会在then处理程序处理完并返回结果之前解析返回的promise 。
让Observable.toPromise()在promise链中工作的任何已知问题或我可能测试的替代方法使其成为与promise链兼容的结果?在http请求,promise链中的最后一项,已完成其异步请求并返回结果之前,我被此解析承诺阻止。
例如
this.myService.getSomethingInvolvingingMultiplePromiseCalls().then(result => {
let valueFromSomethingInvolvingMultiplePromiseCalls = result;
}, err => {
console.error('landed in app.component outer promise rejected handler, see output window for details')
})
public getSomethingInvolvingingMultiplePromiseCalls(): Promise<string> {
return this.getSomethingInvolvingPromiseCall().then(resultPromise1 => {
let resultPromise1propertyFoo = resultPromise1.propertyFoo;
return this.getSomethingInvolvingNg2HttpProviderToPromiseCall(resultPromise1propertyFoo);
}
.then(resultPromise2 => {
let resultPromise2propertyBar = resultPromise2.propertyBar;
return resultPromise2propertyBar;
}
}
getSomethingInvolvingNg2HttpProviderToPromiseCall(arg1: string): Promise<string> {
let body = 'some body content leveraging arg1';
let headers = new Headers({ 'Authorization': 'Bearer ' + accessToken, 'Content-Type': 'application/x-www-form-urlencoded' });
let options = new RequestOptions({ headers: headers });
return this.http.post(resourceBaseAddress + '/someRestApi', body, options).toPromise().then(response => {
let responseJson = response.json();
return responseJson['someJsonProperty'];
});
}
}
提前感谢任何见解或建议。
答案 0 :(得分:4)
我找到了解决方法。
它涉及创建和返回一个typescript延迟的promise,我控制解析只有当我在使用angular2 http provider toPromise()调用方法的处理器内部时才进行解析。
我没有与其他承诺链接方案有什么关系,但无论出于何种原因,在这种情况下允许停放方法调用方,直到完成链中的http提供者toPromise()调用。
public getSomethingInvolvingingMultiplePromiseCalls(): Promise<string> {
let resolveFn, rejectFn;
let promise = new Promise((resolve, reject) => { resolveFn = resolve; rejectFn = reject; });
this.getSomethingInvolvingPromiseCall().then(resultPromise1 => {
this.getSomethingInvolvingNg2HttpProviderToPromiseCall(resultPromise1).then(resultPromise2 => resolveFn(resultPromise2));
}
return promise; // return the promise for outside callers to wait on
}
答案 1 :(得分:1)
请参阅承诺链中的一个observable的以下工作示例。
var promise = new Promise((resolve, reject) => {
resolve(3)
}).then((num) => {
return Rx.Observable.create((observer) => {
setTimeout(() => {
observer.next(5);
observer.onCompleted();
}, 0)
}).toPromise()
}).then((num) => {
return num * 2;
})
promise.then((number) => {
alert(number);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.7/rx.all.js"></script>
如果您使用.toPromise()
,则必须调用observer.onCompleted()
。如果你转换一个未完成你的承诺的观察结果将无法解决。