Поскольку getBase64
является асинхронной операцией, вы не можете сразу использовать ее результат. Вам нужно подождать, либо позвонив по номеру then
(как вы уже экспериментировали), либо используя async/await
.
Версия async/await
(которая также является частью стандарта es 2017) проще понять, особенно если вы новичок в асинхронном программировании. Общее практическое правило, если вы видите Promise
и вам нужно использовать значение, вам нужно будет использовать оператор await
(и сделать ваш метод асинхронным)
async ngAfterViewInit() {
let image = new Image();
var base64 = await this.getBase64(fileObject, this.processImage());
image.src = base64; //Now available
let editor = new PhotoEditorSDK.UI.ReactUI({
container: this.editor.nativeElement
editor: {
image: image
}
});
}
public getBase64(file, onLoadCallback) {
return new Promise<string>(function(resolve, reject) {
var reader = new FileReader();
reader.onload = function() { resolve(reader.result as string); };
reader.onerror = reject;
reader.readAsDataURL(file);
});
}
Вы также можете переместить свой код в обратный вызов, переданный вызову then
, но это может быть немного сложнее для чтения (особенно, если вы только начинаете с асинхронного кода) и если вам нужно организовать несколько асинхронных операций чтение кода быстро становится проблемой
async ngAfterViewInit() {
let image = new Image();
this.getBase64(fileObject, this.processImage())
.then(base64=>
{
image.src = base64; // available now
let editor = new PhotoEditorSDK.UI.ReactUI({
container: this.editor.nativeElement
editor: { image }
});
});
}