2016-02-20 2 views
3

Если я вызываю метод, поддерживающий обещание, используя провайдер 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']; 
     }); 
    } 
} 

заранее спасибо за любые идеи или предложения.

ответ

3

Я нашел разрешение на это.

Это связано с созданием и возвратом отложенного обещания от машинописного текста, которое я контролирую, разрешая только тогда, когда я приземлился внутри обработчика для вызова метода с использованием углового2 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 
} 
1

См. Ниже рабочий пример наблюдаемого в цепочке обещаний.

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() должен быть вызван. Если ваше преобразование наблюдаемого, которое не выполнит ваше обещание, не будет разрешено.

+0

благодарю вас за ответ и предложения wrt gotchas. в моем случае ng2 this.http.post (resourceBaseAddress + '/ generateToken, body, options) – myusrn

+0

- это уже то, что я ожидаю быть Rx.Observable, и поэтому кажется, что ваш комментарий о необходимости запуска onCompleted необходим для обещание разрешить. – myusrn

+1

В моем случае он в конечном итоге разрешает, но первоначально не возвращает действительное обещание, которое находится в состоянии ожидания, поэтому я думаю, что цепочка обещаний возвращается слишком рано. Я попробовал сделать следующее: return this.http.post (resourceBaseAddressWoVer + '/ generateToken', body, options) .do (response => response) .toPromise(). Then (response => {', но получил тот же Я не могу сказать, как вызвать oncompleted b4, возвращая объект обещания из Observable, чтобы заставить это работать? – myusrn

 Смежные вопросы

  • Нет связанных вопросов^_^