Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular http提供程序Observable.toPromise()在承诺链中未按预期工作_Angular_Angular2 Services - Fatal编程技术网

Angular http提供程序Observable.toPromise()在承诺链中未按预期工作

Angular http提供程序Observable.toPromise()在承诺链中未按预期工作,angular,angular2-services,Angular,Angular2 Services,如果我使用ng2 http provider Observable.toPromise()支持调用启用承诺的方法,它会按预期工作,但当我将其用作承诺链的一部分时,它会在处理程序处理并返回结果之前解析返回的承诺 让Observable.toPromise()在承诺链中工作有任何已知问题吗?或者我可能会测试其他方法以使其成为承诺链兼容的结果?在http请求(承诺链中的最后一项)完成其异步请求并返回结果之前,我被此解析承诺阻止 比如说 this.myService.getSomethingInvolv

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

让Observable.toPromise()在承诺链中工作有任何已知问题吗?或者我可能会测试其他方法以使其成为承诺链兼容的结果?在http请求(承诺链中的最后一项)完成其异步请求并返回结果之前,我被此解析承诺阻止

比如说

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'];
      });
    }
}
this.myService.getSomeThingInvolvingMultiplePromiseCall()。然后(结果=>{
让ValueFromsomethingInvolvingMultiplePromiseCall=结果;
},err=>{
console.error('登录到app.component外部承诺拒绝处理程序中,有关详细信息,请参阅输出窗口')
})
public getsomething包含多个promisecall():Promise{
返回此.getSomethingInvolvingPromiseCall()。然后(resultPromise1=>{
让resultPromise1propertyFoo=resultPromise1.propertyFoo;
返回此.GetSomethingInvolving2HttpProviderToProMiseCall(resultPromise1propertyFoo);
}
。然后(resultPromise2=>{
让resultPromise2propertyBar=resultPromise2.propertyBar;
返回结果Promise2PropertyBar;
}   
}
GetSomethingInvolving2HttpProviderToProMiseCall(arg1:string):承诺{
let body='some body content arg1';
let headers=新的头({'Authorization':'Bearer'+accessToken,'Content Type':'application/x-www-form-urlencoded'});
let options=newrequestoptions({headers:headers});
返回此.http.post(resourceBaseAddress+'/someRestApi',body,options).toPromise()。然后(响应=>{
让responseJson=response.json();
返回responseJson['someJsonProperty'];
});
}
}

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

请参阅以下承诺链中可观察到的工作示例

var承诺=新承诺((解决、拒绝)=>{
决议(3)
})。然后((num)=>{
返回Rx.Observable.create((观察者)=>{
设置超时(()=>{
观察员:下一个(5);
observer.onCompleted();
}, 0)
}).toPromise()
})。然后((num)=>{
返回数*2;
})
承诺。然后((数字)=>{
警报(编号);
});

我找到了解决办法

它涉及到创建并返回一个typescript延迟承诺,即只有在使用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
}
public getsomething包含多个promisecall():Promise{
让我们决定fn,拒绝fn;
让允诺=新允诺((resolve,reject)=>{resolveFn=resolve;rejectFn=reject;});
this.getSomethingInvolvingPromiseCall()。然后(resultPromise1=>{
这个.getSomeThingInvolving2HttpProviderToPromiseCall(resultPromise1)。然后(resultPromise2=>resolveFn(resultPromise2));
}
return promise;//返回外部呼叫者等待的承诺
}

感谢您的回复和建议,我的示例是ng2 this.http.post(resourceBaseAddress+'/generateToken',body,options)已经是我期望的Rx。可以观察到,因此您关于需要在完成时触发的评论对于承诺的解决是必要的。在我的情况下,它最终会解决,但最初不会返回处于挂起状态的有效承诺,这就是为什么我猜承诺链返回得太早的原因。我尝试了以下方法来解决如果发生这种情况,请
返回this.http.post(resourceBaseAddressWoVer+/generateToken',body,options).do(response=>response).toPromise()。然后(response=>{
但得到了相同的结果。我是否忽略了如何调用oncompleted b4从可观察对象返回承诺对象以使其工作的要点?