最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

排序数组返回数组无序

IT培训 admin 3浏览 0评论

排序数组返回数组无序

我现在很困惑。我花了最后一个小时,尝试根据目录的创建日期对目录进行排序。这是我的位置:

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();

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论