Вы можете использовать оператор from
из RxJs, который преобразует любое Обещание в Observable и далее связывает его (возможно, используя flatMap
).См .: https://www.learnrxjs.io/operators/creation/from.html
Подобные вопросы отвечают здесь:
Возврат Наблюдаемый внутри Обещания
Как вернуть Наблюдаемый после некоторого Обещания получитьразрешен в Ionic 2 / Angular 2? (упомянутый здесь оператор fromPromise
следует заменить новым оператором from
)
Другой вариант - использовать ключевые слова async
await
в Typesript /ES6.Где бы вы ни вызывали метод uploadFile
, просто используйте (await uploadFile(formInstanceId, questionId, repeatId, filePath, isEquipment))
, который вернет наблюдаемую информацию, которая была возвращена методом networkService.postFile()
.
Ваш метод станет:
public async uploadFile(formInstanceId, questionId, repeatId, filePath, isEquipment): Promise<Observable<any>> {
const result = await this._file.resolveLocalFilesystemUrl(filePath);
console.log("fileSelected", result);
let fileName = result.name;
let nativeURL = result.nativeURL;
let path = nativeURL.substring(0, nativeURL.lastIndexOf("/"));
const buffer = await this._file.readAsArrayBuffer(path, fileName);
let imgBlob = new Blob([buffer], {type: "image/jpeg"});
let params = {fileName: 'attachment'};
let query = this.encodeQueryData(params);
let uploadFileURL = this._networkService.serverUrl + '/api/upload?' + query;
return this._networkService.postFile(uploadFileURL, fileName, imgBlob).pipe(map(response => {
console.log(response);
return {
formInstanceId: formInstanceId,
questionId: questionId,
repeatId: repeatId,
filename: response[0].filepath,
isEquipment: isEquipment
};
},
error => {
return throwError(error);
}
));
}
Вот какВы потребляете его:
(await uploadFile(formInstanceId, questionId, repeatId, filePath, isEquipment)).subscribe(result=> { /* ...Your code here... */ });
Асинхронное ожидание: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-1-7.html