Я рекомендую в Angular стараться держать вещи как наблюдаемые. Приятно быть последовательным, вместо того, чтобы переключаться между наблюдениями и обещаниями.
Мне не очень понятно, возвращает ли myService.something () обещание или наблюдаемое. Если наблюдаемые:
private getSomeData(): Observable<<DataObjectArray[]> {
return this.myService.something().pipe(
map(response => response.children)
);
}
, если обещание очень похоже, но:
private getSomeData(): Observable<<DataObjectArray[]> {
return fromPromise(this.myService.something()).pipe(
map(response => response.children)
);
}
Тогда:
public compileData(): Observable<DifferentDataArray[]> {
// get some stuff from a config, then make service call
return this.getSomeData().pipe(
map(someData => {
/* If I have a promise returned, someData errors saying not an array type */
var dataCollection = [];
for (let oneData of someData){
/* loop through config data + service data making a return object array */
// should dataCollection.push(changedData);
}
return dataCollection;
});
);
}
Наконец потреблять где-то еще:
[ 113]Примечания: оператор трубы довольно мощный. Он берет наблюдаемое и позволяет вам поработать над ним перед возвратом. В этом случае я использовал оператор карты, потому что вы просто немного меняете форму возврата. В конце цепочки вы всегда должны подписаться на наблюдаемую, чтобы получить данные обратно (согласно последнему черному в моем примере)
private getSomeData(): DataObjectArray[] {
return this.myService.something().map((response: Response) => {
return response.children;
});
}
Должно быть
private getSomeData(): Promise<DataObjectArray[]> {
return this.myService.something().map((response: Response) => {
return response.children;
});
}
Вы можете использовать новые ключевые слова Javascript async
и await
Сначала сделайте getSomeData
асинхронным, что также требует от него возврата обещания:
private async getSomeData(): Promise<DataObjectArray[]> {
return this.myService.something().map((response: Response) => {
return response.children;
});
}
, затем ожидайте функция в compileData
:
let someData = await this.getSomeData();
Однако это означает, что compileData
, поскольку он возвращает результат, должен быть также асинхронным. Это означает, что вам нужно добавить ключевое слово async
и изменить тип на Promise<DifferentDataArray[]>
.
В случае, если вас не волнует ваш результат, вы можете вызвать асинхронную функцию без ожидания, поэтому вам также не нужно ждать результата, и он обрабатывается в фоновом режиме. Если вы полагаетесь на результат, вы должны его дождаться. В этом случае другие части вашего приложения могут продолжаться! В любом случае, если вы разрабатываете асинхронное приложение, вы должны подумать о том, что произойдет, когда все равно.
Ваша полная функция compileData:
public async compileData(): Promise<DifferentDataArray[]> {
// get some stuff from a config, then make service call
let someData = await this.getSomeData();
/* If I have a promise returned, someData errors saying not an array type */
for (let oneData of someData){
/* loop through config data + service data making a return object array */
}
return this.dataCollection;
}
public compileData(): DifferentDataArray[] {
// get some stuff from a config, then make service call
let someData = this.getSomeData();
/* If I have a promise returned, someData errors saying not an array type */
for (let oneData of someData){
/* loop through config data + service data making a return object array */
}
return this.dataCollection;
}