【问题标题】:Using function to return value in a map?使用函数在地图中返回值?
【发布时间】:2021-04-14 18:28:34
【问题描述】:

我映射到一个对象数组并为“latestMessage”添加一个值

latest() 函数搜索消息并返回和对象。但是地图的结果不包含新的属性。如果我删除了最新的函数并只输入一个字符串,尽管它可以工作。

function latest(userId) {
  Chat.findOne({ $or: [{ to: userId }, { from: userId }] }, {}, { sort: { createdAt: -1 } }, function (err, msg) {

    return msg

  })
}

不起作用:

let array = users.map(v => ({ ...v._doc, latestMessage: latest(v._id) }))

作品:

let array = users.map(v => ({ ...v._doc, latestMessage: {test: 'test'} }))

【问题讨论】:

标签: javascript arrays object mongoose mapping


【解决方案1】:

由于Chat.fineOne 正在运行一个回调函数,您必须在该函数中执行您的逻辑。我不确定您的应用程序的其余部分是如何设置的,但您可能能够创建该对象并将其传递给您的查询。当回调发生时,查询可以更新对象。请注意,这将是在地图已经创建之后,因为它是async

let array = users.map(v => {
  let value = { ...v._doc, latestMessage: "" };
  setLatest(value);
  return value;
});

function setLatest(value) {
  Chat.findOne({ $or: [{ to: value._id }, { from: value._id }] }, {}, { sort: { createdAt: -1 } }, function (err, msg) {
    value.latestMessage = msg;
  })
}

【讨论】:

  • 试过了,控制台记录了结果,它返回了猫鼬查询对象
  • 看起来这个回调是异步发生的,所以你必须处理它。
猜你喜欢
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2021-08-18
  • 1970-01-01
  • 2016-05-16
  • 2020-09-19
  • 2021-08-06
相关资源
最近更新 更多