Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.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
Javascript 可观察到的未调用捕获中的承诺错误_Javascript_Angular_Angular Promise_Angular2 Observables - Fatal编程技术网

Javascript 可观察到的未调用捕获中的承诺错误

Javascript 可观察到的未调用捕获中的承诺错误,javascript,angular,angular-promise,angular2-observables,Javascript,Angular,Angular Promise,Angular2 Observables,我使用@angular/http进行http调用(可观察),使用NativeStorage库进行存储机制,这是Promise。这就是为什么我使用FromPromise将Promise函数“NativeStorage.getItem(“xxx”)转换为Observable public getExternalAccessTokenFromStorage(): Observable<any> { let externalAccessTokenPromise = NativeSto

我使用@angular/http进行http调用(可观察),使用NativeStorage库进行存储机制,这是Promise。这就是为什么我使用FromPromise将Promise函数“NativeStorage.getItem(“xxx”)转换为Observable

public getExternalAccessTokenFromStorage(): Observable<any> {
    let externalAccessTokenPromise = NativeStorage.getItem('externalAccessToken');
    let getExternalAccessTokenFromStorage: Observable<any> = Observable.fromPromise(externalAccessTokenPromise);

    return getExternalAccessTokenFromStorage.map(x => {
        return x;
    }).catch((error: any) => 
        Observable.throw(error.json().error || 'Server error');
    );
}
我甚至不确定这是否是一个好的实践,并且在“console.log(“HIT SUCCESSFULLY”);”行中断开了链并停止执行代码

由于存储中没有名为“externalAccessToken”的项,所以在Promise中捕获异常null是正常的,但我不理解为什么它在这之后停止执行

到目前为止,我一直尝试返回null以外的其他内容,并使用“Promise.reject()”,这导致了“Unhandled Promise-rejection”错误

我如何保持代码的执行并使用Observable的catch函数

public getExternalAccessTokenFromStorage(): Observable<any> {
    let externalAccessTokenPromise = NativeStorage.getItem('externalAccessToken');
    let getExternalAccessTokenFromStorage: Observable<any> = Observable.fromPromise(externalAccessTokenPromise.then(x => x)
   .catch(() => {
        console.log("HIT SUCCESSFULLY");
        return null
   }));

    return getExternalAccessTokenFromStorage.map(x => {
        console.log("NOT HIT AT ALL");
        return x;
    }).catch(() => {
        console.log("NOT HIT AT ALL");
        return null;
    });
}



public getUserInfo(): Observable<StoredUserModel> {        
    //Get External Access Token From LocalStorage        

    return this.getExternalAccessTokenFromStorage().flatMap((x: IExternalAccessTokenBindingModel) => {
        return this.getAccessTokenFromStorage().flatMap((accessToken: AccessTokenModel) => {
            console.log("NOT HIT AT ALL");
            let headers = new Headers();
            headers.append("Authorization", "Bearer " + accessToken.access_token);
            headers.append("Content-Type", "application/json");
            let options = new RequestOptions({ headers: headers });
            var externalBindingModel = JSON.stringify(x);
            return this.http.post(this.baseUrl + '/api/Account/ExternalUserInfo', externalBindingModel, options).map((res: Response) => {
                //ADD USER INTO NATIVESTORAGE
                this.addUserIntoStorage(res.json());
                return res.json();
            });
        });
    }).catch(x => {
        return this.getAccessTokenFromStorage().flatMap((accessToken: AccessTokenModel) => {
            console.log("NOT HIT AT ALL");
            let headers = new Headers();
            headers.append("Authorization", "Bearer " + accessToken.access_token);
            let options = new RequestOptions({ headers: headers });
            return this.http.get(this.baseUrl + '/api/Account/UserInfo', options).map((res: Response) => {
                //ADD USER INTO NATIVESTORAGE
                let user: StoredUserModel = res.json();
                this.addUserIntoStorage(res.json());
                return user;
            });
        }).catch(error => {
            return null;
        });
    });
}

public getExternalAccessTokenFromStorage():可观察的问题在于您正在捕获错误,但没有处理错误。您将希望将错误作为可观察对象抛出

public getExternalAccessTokenFromStorage(): Observable<any> {
    let externalAccessTokenPromise = NativeStorage.getItem('externalAccessToken');
    let getExternalAccessTokenFromStorage: Observable<any> = Observable.fromPromise(externalAccessTokenPromise.then(x => x)
   .catch(() => {
        console.log("HIT SUCCESSFULLY");
        return null
   }));

    return getExternalAccessTokenFromStorage.map(x => {
        console.log("NOT HIT AT ALL");
        return x;
    }).catch(() => {
        console.log("NOT HIT AT ALL");
        return null;
    });
}



public getUserInfo(): Observable<StoredUserModel> {        
    //Get External Access Token From LocalStorage        

    return this.getExternalAccessTokenFromStorage().flatMap((x: IExternalAccessTokenBindingModel) => {
        return this.getAccessTokenFromStorage().flatMap((accessToken: AccessTokenModel) => {
            console.log("NOT HIT AT ALL");
            let headers = new Headers();
            headers.append("Authorization", "Bearer " + accessToken.access_token);
            headers.append("Content-Type", "application/json");
            let options = new RequestOptions({ headers: headers });
            var externalBindingModel = JSON.stringify(x);
            return this.http.post(this.baseUrl + '/api/Account/ExternalUserInfo', externalBindingModel, options).map((res: Response) => {
                //ADD USER INTO NATIVESTORAGE
                this.addUserIntoStorage(res.json());
                return res.json();
            });
        });
    }).catch(x => {
        return this.getAccessTokenFromStorage().flatMap((accessToken: AccessTokenModel) => {
            console.log("NOT HIT AT ALL");
            let headers = new Headers();
            headers.append("Authorization", "Bearer " + accessToken.access_token);
            let options = new RequestOptions({ headers: headers });
            return this.http.get(this.baseUrl + '/api/Account/UserInfo', options).map((res: Response) => {
                //ADD USER INTO NATIVESTORAGE
                let user: StoredUserModel = res.json();
                this.addUserIntoStorage(res.json());
                return user;
            });
        }).catch(error => {
            return null;
        });
    });
}
public getExternalAccessTokenFromStorage(): Observable<any> {
    let externalAccessTokenPromise = NativeStorage.getItem('externalAccessToken');
    let getExternalAccessTokenFromStorage: Observable<any> = Observable.fromPromise(externalAccessTokenPromise);

    return getExternalAccessTokenFromStorage.map(x => {
        return x;
    }).catch((error: any) => 
        Observable.throw(error.json().error || 'Server error');
    );
}

问题是您正在捕获错误,但没有处理错误。您将希望将错误作为可观察对象抛出

public getExternalAccessTokenFromStorage(): Observable<any> {
    let externalAccessTokenPromise = NativeStorage.getItem('externalAccessToken');
    let getExternalAccessTokenFromStorage: Observable<any> = Observable.fromPromise(externalAccessTokenPromise);

    return getExternalAccessTokenFromStorage.map(x => {
        return x;
    }).catch((error: any) => 
        Observable.throw(error.json().error || 'Server error');
    );
}

Catch
的工作原理与编程中的
try/Catch
类完全相同

请给出以下示例:

try {
   throw new Error('bang');
} catch(ex) {
   // do nothing
}

console.log('I'm still reachable');
我们可以通过如下方式重现上述可观察数据:

let o = Observable.create((observer)=>{
     observer.error(new Error('bang'));
}).catch(()=>{ 
    // do nothing
});

o.subscribe(()=>{
   console.log('I'm still reachable');
});
如果您想捕获并处理错误,但随后使用
try/catch
阻止下面的代码执行,您可以这样做:

try {
   throw new Error('bang');
} catch(ex) {
   // do some logic here
   throw ex;
}

console.log('I cannot be reached');
在可见光中也是一样的。您必须重新抛出错误,或者生成一个同样失败的可观察结果

let o = Observable.create((observer)=>{
     observer.error(new Error('bang'));
}).catch((ex)=>{ 
    // do some logic here
    return Observable.throw(ex);
});

o.subscribe(()=>{
   console.log('I cannot be reached');
});

Catch
的工作原理与编程中的
try/Catch
类完全相同

请给出以下示例:

try {
   throw new Error('bang');
} catch(ex) {
   // do nothing
}

console.log('I'm still reachable');
我们可以通过如下方式重现上述可观察数据:

let o = Observable.create((observer)=>{
     observer.error(new Error('bang'));
}).catch(()=>{ 
    // do nothing
});

o.subscribe(()=>{
   console.log('I'm still reachable');
});
如果您想捕获并处理错误,但随后使用
try/catch
阻止下面的代码执行,您可以这样做:

try {
   throw new Error('bang');
} catch(ex) {
   // do some logic here
   throw ex;
}

console.log('I cannot be reached');
在可见光中也是一样的。您必须重新抛出错误,或者生成一个同样失败的可观察结果

let o = Observable.create((observer)=>{
     observer.error(new Error('bang'));
}).catch((ex)=>{ 
    // do some logic here
    return Observable.throw(ex);
});

o.subscribe(()=>{
   console.log('I cannot be reached');
});

为什么不使用
Observable.catch
而不是
Promise.catch
,即将错误处理从Promise
中移出?我已经尝试过了,它会抛出类似“未处理的错误”:item null异常。如果您希望我可以生成并编写准确的错误是的,请给出一个没有任何无关细节的答案。@JonSharpe我已经更新了问题提示您需要从
catch
回调返回一个observable-为什么不使用
observable.catch
而不是
Promise.catch
,也就是说,将错误处理从promise中移出
?我已经尝试过了,它会抛出类似“未处理的错误”:item null异常。如果你愿意,我可以写出准确的错误是的,请给出一个没有任何无关细节的答案。@jonrsharpe我已经更新了问题提示您需要从
catch
回调返回一个observable-您需要返回
observable。throw
否则什么也不会发生。您需要返回
observable.throw
否则什么也不会发生。感谢您提供的详细信息;返回可观察的。抛出(ex)WorkedHanks以获取详细信息;返回可观察。投掷(ex)有效