2017-07-25 5 views
0

サービスを使用してサーバーに画像をアップロードしています。ここにあります: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; 
    }); 
} 
+0

「Observable.fromEvent」演算子を試して、onload evを聞きましたか?観察可能なものとして。 – cyrix

+0

いいえ、私はそれについて知りません、あなたは簡単な例を作ることができますか? – trichetriche

答えて

0

あなたは一例Observable.fromEventのために使用したり、そのようなロード画像のため、自分で観察を作成することができます。

addPictures(files: File[], folder: string): Observable<Parse.Object[]> { 
 
    let hasError = false; 
 
    let data$ = files.map(file => { 
 
    let [type, ext] = file.type.split('/'); 
 
    if (type.toLowerCase() !== 'image' || !environment.imgExts.includes(ext.toLowerCase())) { 
 
     hasError = true; 
 
    } 
 
    return Observable.create(observer => { 
 
     let image = new Image(); 
 
     image.src = window.URL.createObjectURL(file); 
 
     image.onload = (e) => { 
 
      let parsedImage = { url: '', type: file.type, width: image.width, height: image.height }; 
 
      observer.next({ parsedImage, file }); 
 
      observer.complete(); 
 
     }; 
 
    }); 
 
    }; 
 
    if (hasError) { 
 
    return Observable.throw('Invalid extension detected'); 
 
    } 
 
    return Observable 
 
    .forkJoin(data$) 
 
    .toArray() 
 
    .switchMap(([parsedData]) => { 
 
     return Observable.forkJoin(
 
      parsedData.map(data => { 
 
       return this.addPicture(data.parsedImage, data.file, folder) 
 
      }) 
 
     ); 
 
    }); 
 
}

+0

ちょうどそれをテストし、observableの配列が値を持つ前にforkjoinはまだtrigerredになっています... – trichetriche

+0

テストケースでplunkrを追加できますか?または、この拡張子を含むコードを質問に追加しますか? – cyrix

+0

待ってます。実際にhttpコールをああするのを忘れました。私はそれを追加してテストしており、私はあなたに知らせるでしょう! – trichetriche

関連する問題