Вы можете использовать оператор from
из RxJs, который преобразует любое Обещание в Observable и далее связывает его (возможно, используя flatMap
). См. https://www.learnrxjs.io/operators/creation/from.html
Подобные вопросы отвечают здесь:
Возврат Наблюдаемый внутри Обещания
Как вернуть Observable после разрешения Promise в Ionic 2 / Angular 2? (упомянутый здесь оператор fromPromise
должен быть заменен новым оператором from
) [ 1118]
Другой вариант - использовать async
await
ключевые слова в Typesript / ES6. Везде, где вы вызываете метод uploadFile
, просто используйте (await uploadFile(formInstanceId, questionId, repeatId, filePath, isEquipment))
, который будет возвращать наблюдаемую, которая была возвращена методом networkService.postFile()
.
Ваш метод станет:
public async uploadFile(formInstanceId, questionId, repeatId, filePath, isEquipment): Promise> {
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
Если вы считаете, что печать может повлиять на производительность (я так не думаю, если вы печатаете со скоростью менее 10 Кбайт / с), сохраните эти данные в памяти и распечатайте их позже.
Все знают, что лучший способ профилировать загрузку с помощью сонара.
There is a wonderful utility called bootchart which will give you a graphical representation of the boot process and tell you when each task started and how long it took to complete.
Check it out.
(source: bootchart.org)