以同步方式使用Array.sort()是否安全?

时间:2018-10-23 03:35:45

标签: javascript node.js

我不确定Array.sort(callback)是同步的还是异步的。但是我在以下代码片段中使用了updateddate对日期(string类型为await类型存储在数据库中)进行了排序。我是否需要为Array.sort(callback)包括data.sort以确保仅在数组排序完成后才执行其余代码。在同步代码上方使用排序是否正确?我是否应该在modify_data(data,likesData){ data.sort(function(a,b){ return new Date(b.updateddate) - new Date(a.updateddate); }) var nomination_group_id = _.groupBy(data,"submissionid") var likes_group var refined_arr = []; var likesData = likesData _.each(nomination_group_id,function(eachObj){ var mapObj = new Map() mapObj.set('category',eachObj[0] ? eachObj[0].question : " ") mapObj.set('submitter',eachObj[0] ? eachObj[0].email : " ") refined_arr.push([ ...mapObj.values() ]) }) return refined_arr } 的回调中编写其余代码?

getWords

5 个答案:

答案 0 :(得分:4)

  

我不确定Array.sort(callback)是同步的还是异步的

  1. 安全且同步。
  2. Array.sort(sortFunction)参数sortFunction同步应用于数组的每个元素。另外,Javascript是单线程的。

const names = ['adelaine','ben', 'diana', 'carl']

const namesSortedAlphabetically = names.sort() // default is alphabetical sort
console.log('ALPHA SORT', namesSortedAlphabetically)

const namesSortedByLength = names.sort((a, b) => a.length > b.length) // custom sort
console.log('CUSTOM SORT', namesSortedByLength)

  

我需要包括等待Array.sort(callback)

不会,因为Array.sort是同步的,并且不会返回Promise

答案 1 :(得分:3)

这是安全且同步的,因为它不是回调,它只是一个比较器(比较功能)see here

它不是在做某事的最后调用此函数,而是在使用该函数。希望它能使

答案 2 :(得分:2)

是同步的。回调本身并不意味着所有者函数是异步的。 回调仅用于确定排序方式。因此,您可以安全地将下一个逻辑置于回调之外。

答案 3 :(得分:0)

.sort()是JavaScript语言的功能,并且由ECMAScript规范确定为同步

(默认情况下,node.js框架的功能通常是异步的,但是.sort()来自JavaScript语言本身,而不是来自node.js框架。)

涉及任何生产级应用程序时,很可能要异步使用。您可以:

  • 只需将其包装在异步函数范围内,或
  • 编写您自己的异步实现,或
  • 您可以找到针对此问题的几种现成的实施方式,例如npm软件包。

是的,您需要注意,要执行排序的代码需要在排序后执行。如果您在之前的3个选项中选择了第一个选项, ,您可以:

  • 将内容放入一个回调中(可能是次要的事情),或者
  • 使用.then()
  • 建立回调链
  • 使用您提到的await关键字。

请注意,我不想将您与如此众多的解决方案混淆,但是有必要注意它们。随着时间的推移,它们将成为第二自然。 如果这时所有这些都让您感到困惑,我建议您从包裹在异步函数周围并与.sort()函数链接在一起的基本.then()开始。


编辑

如上所述,.sort()本身不接受回调函数,而是接受排序函数。那是对的。为了异步使用.sort(),您必须按照我的建议将其包装在自己的异步函数中。

答案 4 :(得分:0)

修改输入不是一个好主意,您不需要await来确保data.sort是同步的,只需声明一个新变量即可保存排序结果,如:

var sorted_data = data.sort(function(a,b){
  return new Date(b.updateddate) - new Date(a.updateddate);
})
var nomination_group_id = _.groupBy(sorted_data, "submissionid")