首页 > 解决方案 > 使用函数在地图中返回值?

问题描述

我映射一组对象并为“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'} }))

标签: javascriptarraysobjectmongoosemapping

解决方案


由于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;
  })
}

推荐阅读