排序数组返回数组无序
我现在很困惑。我花了最后一个小时,尝试根据目录的创建日期对目录进行排序。这是我的位置:
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
会吐出无序数组。
诺言对我来说是新的,所以我不确定是否是导致问题的诺言链,但是直到第二个then
为止一切似乎都很好。
任何帮助将不胜感激。
回答如下:这是承诺链:如果该链在任何地方都损坏,将无法使用。
您似乎混淆了两个箭头形式:(params) => expression
和(params) => { statements }
。您代码中的所有内容都可以用前者表示,因此我同意了。如果转换为语句块形式,请不要忘记return
(表达式形式隐式执行)。
因为您没有从arrow语句块中返回承诺,所以下一个承诺不会与前一个承诺缝合在一起,因此无需等待,并且事情执行的同步性超出了预期。此外,如果您有多个承诺,则需要等到它们全部准备就绪,可以使用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.all
接收承诺的数组,并在它们全部完成后承诺这些承诺的结果。我们将其链接到一个排序后的数组的承诺中,然后将其链接到控制台中记录该数组的承诺中。
编辑:我不确定,但我认为Node.js核心中不存在Promise.all
。 Node.js的承诺包数量很多,其中都包含Promise.all
,几乎它们中的任何一个都可以(例如Bluebird)。或者,您可以implement it yourself,它不那么大。
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();
排序数组返回数组无序
我现在很困惑。我花了最后一个小时,尝试根据目录的创建日期对目录进行排序。这是我的位置:
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
会吐出无序数组。
诺言对我来说是新的,所以我不确定是否是导致问题的诺言链,但是直到第二个then
为止一切似乎都很好。
任何帮助将不胜感激。
回答如下:这是承诺链:如果该链在任何地方都损坏,将无法使用。
您似乎混淆了两个箭头形式:(params) => expression
和(params) => { statements }
。您代码中的所有内容都可以用前者表示,因此我同意了。如果转换为语句块形式,请不要忘记return
(表达式形式隐式执行)。
因为您没有从arrow语句块中返回承诺,所以下一个承诺不会与前一个承诺缝合在一起,因此无需等待,并且事情执行的同步性超出了预期。此外,如果您有多个承诺,则需要等到它们全部准备就绪,可以使用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.all
接收承诺的数组,并在它们全部完成后承诺这些承诺的结果。我们将其链接到一个排序后的数组的承诺中,然后将其链接到控制台中记录该数组的承诺中。
编辑:我不确定,但我认为Node.js核心中不存在Promise.all
。 Node.js的承诺包数量很多,其中都包含Promise.all
,几乎它们中的任何一个都可以(例如Bluebird)。或者,您可以implement it yourself,它不那么大。
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();