Я пытаюсь преобразовать отдых http наблюдаемый с socket.io-наблюдаемым в моем приложении Angular 2. Остальные наблюдаемые работы как есть. И с опцией сокета, я приближаюсь, но сейчас я получаю сообщение об ошибке, которое наблюдаемый я использую для сокетов, ожидает объект, а не массив. И мне нужно, чтобы он был массивом, чтобы иметь возможность перебирать элементы данных.С этим наблюдением в моем приложении Angular 2 не работает?
Во-первых, вот оригинальный HTTP, остальные наблюдаемые функции из моей службы (это работает):
getByGroup() {
return this._http.get(this._url)
.map((response: Response) => response.json())
.catch(this._errorsHandler);
}
_errorsHandler(error: Response) {
console.error(error);
return Observable.throw(error.json().error || 'Server error');
}
И в компоненте Я подписываюсь на это так:
this.clientService.getByGroup()
.subscribe(resRecordsData => this.records = resRecordsData,
responseRecordsError => this.errorMsg = responseRecordsError);
У меня есть «записи», объявленные как пустой массив в компоненте. Затем я использую результат наблюдаемого, который присваивается «записям», для печати в представлении. Все это работает отлично.
Теперь это то, что я пытаюсь сделать с сокет на основе наблюдаемой (это не работает - и это ожидает объект, а не массив) - мне нужна помощь, чтобы понять, почему:
getByGroup() {
const observable = new Observable(observer => {
this.socket = io(this._url);
this.socket.on('getByStage', (data) => {
return data;
});
return() => {
this.socket.disconnect();
};
});
return observable;
}
опять же, я пытаюсь, чтобы подписаться на этот наблюдаемом точно так же, как это:
this.clientService.getByGroup()
.subscribe(resRecordsData => this.records = resRecordsData,
responseRecordsError => this.errorMsg = responseRecordsError);
Но опять же, это не работает в этом втором случае, потому что я получаю сообщение об ошибке сказав:
Тип '{}' не присваивается типу '[] any'.
Как я могу справиться с этим? Как я могу финализировать вызов сокета службы, чтобы ожидать массив вместо объекта? Мне непонятно, почему он ожидает, что объект начнется.
Спасибо. Что-то по-прежнему вызывает проблему, но я предполагаю, что это что-то на стороне api для наших функций сокетов. То, что у вас здесь, выглядит правильно. Re: ваш ответ, так и есть ключ: вы должны явно объявить Observable типом «any []», иначе он будет неявным образом возвращать объект? Просто интересно, почему это не проблема с моим первоначальным звонком? – Muirik
TypeScript использует тип inferring, и в вашем случае предполагаемые типы были несовместимы, поэтому я явно помещал типы. – kemsky
Хорошо, понял. Благодарю. – Muirik