Disclamer : Может быть / должен быть способ реализовать точно такую же концепцию в наблюдаемых, но я не слишком знаком с ними, поэтому, возможно, кто-то может уточнить.
Вашфункция должна возвращать обещание, что означает, что вы должны выполнить
getDataFromApi() {
....
return Promise.all([
...
]);
}
и затем реализовать свою логику в части then в функции вызывающей стороны.Теперь это не очень весело, так как вы будете копировать свой код, который вы пытаетесь устранить.
Для этого ваша функция должна по-прежнему возвращать обещание, которое разрешается после требуемого оператора возврата, например так:
getDataFromApi() {
....
new Promise((resolve, reject) => {
Promise.all([
...
]).then(result => {
const headers = new Headers();
...
const body = new FormData();
...
// This is equavilent to your desired return
resolve(this.http.post(url, body, headers));
});
});
}
, а затем реализовать подписку POST в блоке вызывающего then
, например:так:
this.service.getDataFromApi()
.then(observ => {
observ.subscribe(result => {
// Use your response here
});
});
Вы даже можете использовать асинхронные функции, что было бы намного проще в коде, просто вместо того, чтобы обернуть функцию в новое обещание, вы можете просто await
на Promise.all
итогда return
, который последует, будет преобразован в разрешение для вас.
Редактировать: Еще лучше, если каждый раз, когда вы просто подписываетесь на данные JSON и хотите, чтобы они возвращалиськонцепцию можно обобщить, чтобы сделать код в вызывающей стороне более лаконичным:
this.service.getDataFromApi().then(finalData => {
// This is the final returned data ...
}, (err) => {
//allows error to be handled
});
Это может быть достигнуто путем разрешения обещания в методеайдеров в блоке подписки следующим образом:
getDataFromApi() {
return new Promise((resolve, reject) => {
Promise.all([...]).then(result => {
const headers = new Headers();
const body = new FormData();
this.http
.post(url, body, headers)
.map(res => res.json())
.subscribe(data => {
if (data == '{}') {
reject([]);
} else {
resolve(data);
}
});
});
})
}