2017-12-11 4 views
-3

マルチプロミスを解決する正しい方法は何ですか?鎖か.mapか?JS:この約束事を解決するには?

let promises = []; 
// data is a binary zip file 
JSZip.loadAsync(data).then((zip) => { 
    for (let filename in zip.files) { 
     zip.files[filename].async("blob") 
     // ********** Problem! ********** 
     // because of the following .then, the promises.push is deferred 
     // and so the next .then is run immediately 
      .then((fileData) => { 
       promises.push(this.file.writeFile(...)); 
      }) 
    } 

    return Promise.all(promises); 
}).then(() => { 
    ... 
+1

を与えるかもしれませんか? – marekful

+0

自分のコードを編集しました(追加するのを忘れた)。それは問題を解決するものではありません。 – GuyC

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all – Chidambaram

答えて

2

zip.files[filename].async("blob")はあなたが解決するzip.files[filename].async("blob")を待つべきFILEDATAに解決する約束を返す知ったが疑うの方法はありません。

zip.filesた場合は、約束にzip.filesをマッピングするよりエレガントになる配列である(メハリの答えを参照)、それがオブジェクトである場合(プロパティがzip.filesのプロトタイプである場合を除く)、その後map(Object.keys(zip.files)for inよりも良いだろう

次は機能しますか?

JSZip.loadAsync(data) 
.then((zip) => { 
    let promises = []; 
    for (let filename in zip.files) { 
     promises.push(
     zip.files[filename].async("blob") 
     // ********** Problem! ********** 
     // because of the following .then, the promises.push is deferred 
     // and so the next .then is run immediately 
     .then((fileData) => { 
      this.file.writeFile(...) 
     }) 
    ) 
    } 

    return Promise.all(promises); 
}).then(() => { 
+1

あなたが行った変更を説明し、それがOPが持っていたコードよりもうまくいくと思われる理由は、あなたの答えはすべてにとって貴重です。私はあなたが正しいと思うが、偉大な答えは、人々があなたが何を変えたのか、そしてなぜそれを理解するのではない。 – jfriend00

+0

@ jfriend00確かに、答えを更新 – HMR

+0

ありがとう!問題が解決しました。 – GuyC

1

私は、非同期APIの使用している程度全くわからないけど、次のスニペットは、 `` Promise.all(約束を)返すあなたにいくつかのハイライト

JSZip.loadAsync(data).then(zip => { 
     const files = zip.files; 
     const blobs = files.map(filename => { 
      return files[filename].async("blob") 
     }); 
     return Promise.all(blobs); 
    }) 
    .then(fileData => { 
     fileData.map(file => { 
      // TODO... file.writeFile() 
     }); 
    }) 
関連する問題