サービスを使用してサーバーに画像をアップロードしています。ここにあります:Angular 2&Vanilla JS:httpコールを行う前に画像が読み込まれるまで待ちます
addPictures(files: File[], folder: string): Observable<Parse.Object[]> {
let hasError = false;
for (let file of files) {
let [type, ext] = file.type.split('/');
if (type.toLowerCase() !== 'image' || !environment.imgExts.includes(ext.toLowerCase())) { hasError = true; }
}
if (hasError) { return Observable.throw('Invalid extension detected'); }
let observables: Observable<Parse.Object>[] = [];
for (let file of files) {
// Get its size
let img = new Image();
img.onload =() => {
// Create the Parse document
let parseImg = { url: '', type: file.type, width: img.width, height: img.height };
// Upload it on Amazon and add it to DB
observables.push(this.addPicture(parseImg, file, folder));
console.log('pushing to array');
}
img.src = window.URL.createObjectURL(file);
}
console.log('forkjoin');
return Observable.forkJoin(observables);
}
すべての機能は素晴らしいです。私が直面している問題は、img.onload
を使用すると、forkJoin
は起動前に待機しないということです。私が望むのはすべての画像がロードされるのを待ってから、thr forkJoinがすべてを送信するようトリガーします。
私はすでに、最後の項目が配列にプッシュされ、件名でforkJoinをトリガーしたときに試行しましたが、問題はコンポーネントがCannot read property 'subscribe' of undefined
の行に沿ってエラーを返すことです。ここ
EDITはTHR fromEventのための私のコードです:
addPictures(files: File[], folder: string): Observable<Parse.Object[]> {
let hasError = false;
for (let file of files) {
let [type, ext] = file.type.split('/');
if (type.toLowerCase() !== 'image' || !environment.imgExts.includes(ext.toLowerCase())) { hasError = true; }
}
if (hasError) { return Observable.throw('Invalid extension detected'); }
let observables: Observable<Parse.Object>[] = [];
for (let file of files) {
// Get its size
let img = this.fromImgEvent(file, window.URL.createObjectURL(file), folder);
observables.push(img);
}
console.log('forkjoin');
return Observable.forkJoin(observables);
}
fromImgEvent(file: File, url: string, folder: string) {
return Observable.create(observer => {
let img = new Image();
img.onload =() => {
// Create the Parse document
let parseImg = { url: '', type: file.type, width: img.width, height: img.height };
// Upload it on Amazon and add it to DB
observer.next(this.addPicture(parseImg, file, folder));
observer.complete();
}
img.src = url;
});
}
「Observable.fromEvent」演算子を試して、onload evを聞きましたか?観察可能なものとして。 – cyrix
いいえ、私はそれについて知りません、あなたは簡単な例を作ることができますか? – trichetriche