私は今とても混乱しています。私はこの1時間と、作成日に基づいてディレクトリを並べ替えるのに少し時間を費やしました。これが私がいるところです:
const
fsPromises = require('fs').promises
let
arr = []
fsPromises.readdir(rootPath, 'utf8')
.then((array)=>{
array.forEach((dir)=>{
console.log(dir) // executed last for some reason
fsPromises.stat(`./Projects/${dir}`)
.then((stats)=>{
arr.push([stats.birthtimeMs, dir])
})
})
})
.then(()=>{
arr = arr.sort((a,b)=>{
Math.floor(a[0])-Math.floor(b[0])
})
})
.then(console.log(arr))
ファイナルthen
が順序付けられていない配列を吐き出している理由がわかりません。
Promiseは私にとって新しいので、問題の原因がPromiseチェーンであるかどうかは完全にはわかりませんが、2番目まではすべて問題ないようthen
です。
どんな助けでも大歓迎です。
それはプロミスチェーンです。チェーンがどこかで壊れていると、機能しません。
2つの矢印形式を混同しているようです:(params) => expression
と(params) => { statements }
。あなたのコードのすべてが前者で表現できるので、私はそれを使いました。ステートメントブロック形式に変換する場合は、忘れないでくださいreturn
(式形式は暗黙的に行います)。
矢印ステートメントブロックからpromiseを返さないため、次のpromiseは前のpromiseにステッチされません。したがって、待機が発生することはなく、意図したよりもはるかに同期して実行されます。さらに、複数のプロミスがある場合は、を使用してすべてのプロミスを実行する準備ができるまで待つ必要がありますPromise.all
。これにより、すべてのサブプロミスが実行されるというプロミスが作成され、サブプロミスの結果の配列が返されます。
fsPromises.readdir(rootPath, 'utf8')
.then(array => Promise.all(
array.map(dir =>
fsPromises.stat(`./Projects/${dir}`)
.then(stats => [stats.birthtimeMs, dir])
)
))
.then(arr =>
arr.sort((a, b) =>
Math.floor(a[0]) - Math.floor(b[0])
)
)
.then(arr => console.log(arr))
(私はこれをチェックしなかったので、偶然のドラゴンがあるかもしれません。)
したがって、最初readdir
にファイルの配列を約束します。この配列をマップして、ファイル名ごとにstat
統計情報を約束し、タプルの約束にチェーンします。したがってarray.map
、タプルpromiseの配列を返します。Promise.all
一連のpromiseを受け取り、それらがすべて完了すると、それらのpromiseの一連の結果を約束します。これを、ソートされた配列の約束にチェーンし、次に、配列をログに記録するコンソールの約束にチェーンします。
編集: わかり ません Promise.all
が、Node.jsコアには存在しないと思います 。Node.jsには、含まれているpromiseパッケージがいくつもありますが Promise.all
、ほとんどすべてが含まれています ( Bluebirdなど )。または、 自分 で実装することもできますが 、それほど大きくはありません。
EDIT2:環境でサポートされている場合は、async
/に切り替えることをお勧めします。await
これにより、コードが以前のものに非常に似たものになります。ただし、すべての約束は内部で行われるため、約束についてある程度理解する必要があります。:P
async function statDir() {
let files = await fsPromises.readdir(rootPath, 'utf8');
let stats = [];
for (let file of files) {
let stat = await fsPromises.stat(`./Projects/${file}`);
stats.push([stat.birthtimeMs, file]);
}
stats.sort((a, b) =>
Math.floor(a[0]) - Math.floor(b[0])
);
console.log(stats);
}
statDir();
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加