私は角度4を使用するアプリケーションでプライベートメッセージシステムを実装しています。ユーザーが受信トレイ内の未読メッセージをクリックすると(スレッド内の複数のメッセージの1つを構成する可能性があります)それも未読かもしれません)すべてのメッセージはスレッドに返されるべきですが、メッセージのいずれかが未読であるかどうかを確認し、このメソッドの一部として読み取ったものとしてマークします。次のようにメッセージを取得するために角度結合Http条件付きhttp投稿で応答を得る
呼び出しが見えます:
getMessageThread(id: number, recipientId: number) {
return this.authHttp.get(this.baseUrl + 'users/' + id + '/messages/' + recipientId)
.map(response => response.json())
.catch(this.handleError);
}
とコンポーネントで:
loadMessageThread() {
const currentUserId = +this.authService.decodedToken.nameid;
this.userService.getMessageThread(currentUserId, this.userId).subscribe(messages => {
this.messages = messages;
}, error => {
this.alertify.error(error);
});
}
私はまたのいずれかの場合には、条件付きで呼ばれるべきサービスで、以下のメソッドを持っていますスレッド内の返されたメッセージは未読としてマークされます:
markAsRead(userId: number, messageId: number) {
return this.authHttp.post(this.baseUrl + 'users/' + userId + '/messages/' + messageId, {}).subscribe();
}
これまでのところ、私はいくつかの異なるオプションを試しました。私は以前、これはまた、メソッドを呼び出すために失敗したサブスクライブに「を実行」メソッドを使用してみた場合
loadMessageThread() {
const currentUserId = +this.authService.decodedToken.nameid;
this.userService.getMessageThread(currentUserId, this.userId)
.subscribe(messages => {
this.messages = messages;
_.each(this.messages, function(message) {
if (message.read === false && message.recipientId === currentUserId) {
console.log(message) // works
this.userService.markAsRead(currentUserId, message.id); // fails
}
});
}, error => {
this.alertify.error(error);
});
}
:私がしようとするとサブスクライブの中から、ユーザーサービスを呼び出す場合、私は、ユーザサービス定義されていないを示すエラーを取得しますサービスにサブスクライブ方法を押すことなく、エラー状態にまっすぐに行く:
loadMessageThread() {
const currentUserId = +this.authService.decodedToken.nameid;
this.userService.getMessageThread(currentUserId, this.userId)
.do(messages => {
_.each(messages, function (message: IMessage) {
if (message.read === false && message.recipientId === currentUserId) {
console.log(message) // works
this.userService.markAsRead(currentUserId, message.id); // fails
}
});
})
.subscribe(messages => {
this.messages = messages;
}, error => {
this.alertify.error(error);
});
}
私はこれをoverthinkingていますし、これまでより多くの明白なアプローチをしないのですかはわかりません。助けや助言をいただければ幸いです。
おかげで、ニール
Observablesをチェーンしようとしているようです。それを達成するためにRxJsの 'mergeMap()'メソッドを見てください。 [this](https://stackoverflow.com/questions/40239552/angular-2-chain-observables-in-resolver)も役立つかもしれません。 – Stanislasdrg