よくある質問だと思いますが、具体的には状況は次のとおりです。
私はmammothモジュールを使用して、docx
ファイルをhtml
に変換します。モジュールはpromise
を返します。
私はファイルの配列を持っており、すべてのファイルに対して約束を作成するためにループを使用すると、どのファイルが処理されたかを知るために何らかの約束が結果を返す必要があります。約束のループ。どのように約束が結果を返すのかを検出する方法は?
for(var i=0;i<filesPaths.length;i++){
mammoth.convertToHtml({path: filesPaths[i]})
.then(function(result){
filesHtml.push(result.value);
//here I need to know the value of filesPaths[i]
})
}
あなたの最初の解決策は本当にきれいです。そして、私は '.forEach()'と '.map()'を使う方が良い(クリーナー)と思います。すべての約束事がいつ処理されるのか分からないというあなたのコメントについて、私はこれにカウンタを使用します。 'Promise.all'に関しては、' promiseのいずれかが拒否された場合、全てのPromiseは、拒否された約束の価値を即座に拒否し、それが解決したかどうかにかかわらず、他の約束をすべて捨てるからです。モジュールがいずれかのファイルを変換できない場合、すべてのファイルは変換されません。 – s976
私はあなたがチェックできるわけではありません。明らかにループすることができます(他の非同期作業を処理する機会がないため、タイムアウトまたは他の非同期アプローチを使用します)。私はこれがただちにではなく、あなたは手でそれを扱うべきであることを単に意味します。拒否については、いくつかのエラーコードを価値として解決した約束に切り替えることや、簡単に破棄することは自明です。 – bitifet
...そのアプローチの唯一の本当の欠点(私は簡潔さのために省略した)は、そのような結果を伴ういくらかのハード処理が必要な場合は、それを開始する前にすべてのファイルが変換されるのを待っています。それ以外の場合は、残りのファイルが変換されている間に非同期で実行できます。しかし、それはあなたのケースではないようです... – bitifet