Если я вызываю метод, поддерживающий обещание, используя провайдер http ng2. Наблюдаемое.программирование() поддерживает его, как ожидалось, но когда я использую его как часть цепочки обещаний, разрешает возвращенное обещание перед обработчиком then обработчиком и возвращает результат.http provider Observable.toPromise() не работает, как ожидалось, в цепочках обещаний
Любые известные проблемы с получением Observable.toPromise() для работы в цепочках обещаний или альтернативных способов, которые я могу проверить, чтобы сделать его результатом, совместимым с цепочкой обещаний? Я заблокирован этим соглашающимся обещанием перед запросом http, последним пунктом в цепочке обещаний, завершил запрос async и вернул результат.
Например
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'];
});
}
}
заранее спасибо за любые идеи или предложения.
благодарю вас за ответ и предложения wrt gotchas. в моем случае ng2 this.http.post (resourceBaseAddress + '/ generateToken, body, options) – myusrn
- это уже то, что я ожидаю быть Rx.Observable, и поэтому кажется, что ваш комментарий о необходимости запуска onCompleted необходим для обещание разрешить. – myusrn
В моем случае он в конечном итоге разрешает, но первоначально не возвращает действительное обещание, которое находится в состоянии ожидания, поэтому я думаю, что цепочка обещаний возвращается слишком рано. Я попробовал сделать следующее: return this.http.post (resourceBaseAddressWoVer + '/ generateToken', body, options) .do (response => response) .toPromise(). Then (response => {', но получил тот же Я не могу сказать, как вызвать oncompleted b4, возвращая объект обещания из Observable, чтобы заставить это работать? – myusrn