Я боролся с дня по этому вопросу. Я хочу создать такую ситуацию:
<img [src] = "userdp | async" />
в файле component.ts я хочу иметь только эту строку:
this.userdp = this._userService.getUserDp();
в getUserDp() вот код:
async getUserDp() {
return await
this._http.get(APIvars.APIdomain+'/'+APIvars.GET_USER_DP, { responseType: 'blob' }).toPromise().then( image => {
if (image['type'] === 'application/json') {
return null;
}
const reader = new FileReader();
reader.addEventListener('load', () => {
**return this._dom.bypassSecurityTrustResourceUrl(reader.result.toString());**
});
}, false);
if (image) {
reader.readAsDataURL(image);
}
});
}
Промис не ждет загрузки считывателя в EventListener, любой оператор немедленного возврата дает предполагаемый результат, строка, выделенная жирным шрифтом, — это основные данные, которые нужно вернуть.
Спасибо





Заменить вы обещаете
reader.onload = function (e) {
};
Вы можете облегчить себе жизнь — и жизнь будущих читателей кода — создав метод FileReader, возвращающий промисы, избавившись от обратного вызова в одном месте.
// return a promise that resolves on the 'load' event of FileReader
async function readAsDataURL(image) {
const reader = new FileReader();
return new Promise((resolve, reject) => {
reader.addEventListener('load', () => {
resolve(reader.result.toString());
});
// consider adding an error handler that calls reject
reader.readAsDataURL(image);
});
}
Теперь, когда код обработки файлов "обещан", его проще использовать...
async getUserDp() {
// temp vars so we can read the code
const url = APIvars.APIdomain+'/'+APIvars.GET_USER_DP;
const options = { responseType: 'blob' };
// await replaces .then() here
const image = await this._http.get(url, options).toPromise();
// not sure whether this is right, just following OP logic here
// bail if the image (result of the get()) is falsey or is of type json
if (!image || image['type'] === 'application/json') return null;
// simple to call to await file reading
const readerResult = await readAsDataURL(image);
return this._dom.bypassSecurityTrustResourceUrl(readerResult);
}
Вы можете объяснить, пожалуйста? Я новичок в асинхронности