5

如果我使用 ng2 http 提供程序 Observable.toPromise() 支持调用启用承诺的方法,它会按预期工作,但是当我将它用作承诺链的一部分时,它会在 then 处理程序处理并返回结果之前解析返回的承诺。

让 Observable.toPromise() 在承诺链中工作或我可能测试以使其成为承诺链兼容结果的替代方式的任何已知问题?在 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'];
      });
    }
}

提前感谢您的任何见解或建议。

4

2 回答 2

5

我找到了解决办法。

它涉及创建和返回一个打字稿延迟承诺,只有当我降落在 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
}
于 2016-03-05T17:12:09.350 回答
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()必须调用的一个问题。如果您转换未完成您的承诺的可观察对象将无法解决。

于 2016-02-20T22:13:46.303 回答