2017-03-29 3 views
3

私はそれが早期に(すべての約束を決意する前にログを)解決して実現した後、以下のコードを書いた:私は正しい順序で解決するために、それを書き換えることができたJS Promises:複数の約定をオブジェクトプロパティとして解決するうえで、きちんとした方法がありますか?

readDirPromise 
.then(categoriseFiles) 
.then(({movies, series}) => ({ 
    movies: Promise.all(movies.map(movieTasks)), 
    series: Promise.all(series.map(seriesTasks)) 
})) 
.then((res) => { 
    console.log(' done!', res) 
}) 

readDirPromise 
.then(categoriseFiles) 
.then((cats) => Promise.all(cats.movies.map(movieTasks)).then((movies) => { 
    cats.movies = movies 
    return cats 
})) 
.then((cats) => Promise.all(cats.series.map(seriesTasks)).then((series) => { 
    cats.series = series 
    return cats 
})) 
.then((res) => { 
    console.log(' done!', res) 
}) 

が、私は助けることができないが、考える...もっときれいに、より拡張可能な方法はありますか?

+0

@Randy良い点、ああ – daviestar

答えて

4

から、これは、あなたがしたいオブジェクトにdestructureと再構築、その後かもしれタプルとして戻ってくる:それは価値がある何のため

readDirPromise 
.then(categoriseFiles) 
.then(({movies, series}) => Promise.all([ 
    Promise.all(movies.map(movieTasks)), 
    Promise.all(series.map(seriesTasks))]) 
.then(([movies, series]) => ({movies, series})) 
.then((res) => { 
    console.log(' done!', res) 
}) 
+0

これはかなり意味があります。私はあなたがそのような配列を破壊することができますことを忘れています、ありがとう!他に興味深い解決策がある場合に備えて、これを数日間開いておきますが、これは質問によく答えるようです。 – daviestar

+0

'{movies、series}'と '[movies、series]'を括弧btw – daviestar

+0

Mmで囲む必要があります。私がこの答えを書いている中でどこかでその概念を拾ったのかどうか分からないのは、区切りが括弧を必要としないことを意味する区切られた引数リストとして数えることです。 (考えてみてください、それはありませんか?) –

0

約束を連鎖するのではなく、別の約束を作成して、これまでのようにPromise.all方法で解決することができます。

var p1 = getNewPromise(); 
var p2 = getNewPromise(); 
var p3 = getNewPromise(); 

//あなたがPromise.allの別の層でそれらの両方をラップすることによって(むしろ次々にブロックするよりも)独立映画のステップの一連のステップの実行を行うことができますMDN

Promise.all([p1, p2, p3]).then(values => { 
    console.log(values); 
}); 
+0

更新..私は、私はあなたのポイントを得ると思います - キーを持つオブジェクトを返すのではなく、 '約束を返し、その後、変数としての約束を作成しないでください.all() ' - これは、解決されたデータの形状を、それを再度取得する明確な方法で変更します。詳しく教えてください。 – daviestar

2

、私は非同期/のawait版ãを信じますこのnはのようになります。

async function generateResponse() { 
    const {movies, series} = await readDirPromise.then(categoriseFiles); 
    return { 
    movies: await Promise.all(movies.map(movieTasks)), 
    series: await Promise.all(series.map(seriesTasks)) 
    } 
} 
関連する問題