http 提供程序 Observable.toPromise() 在承诺链中未按预期工作
http provider Observable.toPromise() not working as expected in promise chains
如果我使用 ng2 http 提供程序 Observable.toPromise() 支持调用启用 promise 的方法,它会按预期工作,但是当我将它用作 promise 链的一部分时,它会在 then 处理程序处理之前解析返回的 promise并返回结果。
让 Observable.toPromise() 在 promise 链中工作有任何已知问题,或者我可能会测试其他方法以使其成为 promise 链兼容结果?在 http 请求(promise 链中的最后一项)完成其异步请求并返回结果之前,我被这个 resolving 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'];
});
}
}
提前感谢您的任何见解或建议。
请参阅以下承诺链中可观察对象的工作示例。
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()
。如果您转换一个未完成您的承诺的可观察对象将不会解析。
我找到了解决方法。
它涉及创建和返回一个打字稿延迟承诺,只有当我进入 then 处理程序以使用 angular2 http 提供程序 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
}
如果我使用 ng2 http 提供程序 Observable.toPromise() 支持调用启用 promise 的方法,它会按预期工作,但是当我将它用作 promise 链的一部分时,它会在 then 处理程序处理之前解析返回的 promise并返回结果。
让 Observable.toPromise() 在 promise 链中工作有任何已知问题,或者我可能会测试其他方法以使其成为 promise 链兼容结果?在 http 请求(promise 链中的最后一项)完成其异步请求并返回结果之前,我被这个 resolving 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'];
});
}
}
提前感谢您的任何见解或建议。
请参阅以下承诺链中可观察对象的工作示例。
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()
。如果您转换一个未完成您的承诺的可观察对象将不会解析。
我找到了解决方法。
它涉及创建和返回一个打字稿延迟承诺,只有当我进入 then 处理程序以使用 angular2 http 提供程序 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
}