javascript findIndex()与异步回调,其中mongoose.findById()始终返回0

w8ntj3qf  于 2022-11-20  发布在  Java
关注(0)|答案(1)|浏览(217)

我正在创建一个简单的排队系统。这个票被插入到数组中,代替第一个visitTime大于1的票。这个数组只包含ticketId,在进行任何比较之前,必须使用mongoose findById(ticketId)方法在Mongo数据库中查找。
然而,在写了下面的代码后,我注意到,无论数组中的数据是什么,findIndex()方法总是返回索引0。
代码如下:

const ticketToInsertTime = convertTime(ticket.visitTime)

const index = que.activeTickets.findIndex(async (ticketId) => {
    const ticketFromArray = await Ticket.findById(ticketId).exec()
    const ticketTime = convertTime(ticketFromArray?.visitTime!)
    return ticketTime > ticketToInsertTime
})
if (index < 0) {
    que.activeTickets.push(ticket._id)
    que.save()
} else {
    que.activeTickets.splice(index, 0, ticket._id)
    que.save()
}



function convertTime(time: string) {
    const hour = parseInt(time.split(':')[0])
    const minutes = parseInt(time.split(':')[1])

    return (hour * 60 + minutes)
}
lmyy7pcs

lmyy7pcs1#

了解findIndex功能,当findIndex有一些返回值不是nullundefined时,它会将其视为true,然后返回index。
如果我们把你的问题异步函数返回Promise,那么带有void的promise本身不是nullundefined,所以在这种情况下,它返回的第一次promise的值的索引为0。

对于此解决方案:

1.创建一个原型findIndexAsync自定义函数来模拟findIndex函数。
1.将您匹配应用于数据库查询函数,如带有async的findById,并返回true,与从纯Javascript的findIndex方法返回的结果相同。
1.arr.findIndexAsync可以在异步函数内使用await来解析arr.findIndexAsync返回Promise

  • 谢谢-谢谢
// lets assume we have this array to be iterate
const arr = [12, 3, 5, 6, 7]
// we create custom find Index prototype function

Array.prototype.findIndexAsync = async function(callback) {
  for (let i in this) {
    // this callback simulate same as findIndex function callback
    const data = await callback(this[i], +i, this)
    // if data has true value then break the callbakc calling an return index
    if (data) {
      return +i // as index
    }
  }
  return -1
}

// we name function find Index async function
arr.findIndexAsync(async(accu, index) => {
  // the same you are calling findById method from mongoose you can apply 
  const data = await databaseFinById(accu);
  if (data) {
    return true
  }
}).then(x => {
  // here you can get the index value
  //  you can set await and get the value oif index
  console.log("find matched in db:with array index: ", x)
})

/**
database terms: not need to apply it is only for demo
*/

async function databaseFinById(id) {
  const db = [1, 2, 4, 6, 5, 8, 9]
  return db.find(accu => accu === id);
}

相关问题