2017-02-10 2 views
0

Я пытаюсь преобразовать отдых 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'.

Как я могу справиться с этим? Как я могу финализировать вызов сокета службы, чтобы ожидать массив вместо объекта? Мне непонятно, почему он ожидает, что объект начнется.

ответ

1

Если data является массив, то следующий должен скомпилировать и работать:

getByGroup():Observable<any[]> { 
    const observable = new Observable<any[]>(observer => { 
    this.socket = io(this._url); 
    this.socket.on('getByStage', (data) => { 
     observer.next(data); 
    }); 
     return() => { 
      this.socket.disconnect(); 
     }; 
    }); 
    return observable; 
} 
+0

Спасибо. Что-то по-прежнему вызывает проблему, но я предполагаю, что это что-то на стороне api для наших функций сокетов. То, что у вас здесь, выглядит правильно. Re: ваш ответ, так и есть ключ: вы должны явно объявить Observable типом «any []», иначе он будет неявным образом возвращать объект? Просто интересно, почему это не проблема с моим первоначальным звонком? – Muirik

+0

TypeScript использует тип inferring, и в вашем случае предполагаемые типы были несовместимы, поэтому я явно помещал типы. – kemsky

+0

Хорошо, понял. Благодарю. – Muirik

Смежные вопросы