我有这段代码:
let fullConversations = conversationIdsByUser.reduce(async function(acc, conversation) {
const message = await MessageModel.find({ 'conversationId':conversation._id })
.sort('-createdAt')
.limit(1); // it returns an array containing the message object so I just get it by message[0]
return acc.push(message[0]);
},[]);
我的累加器是一个数组,消息[0]是我要推送的对象。但我有这个错误:
(node:516)UnhandledPromiseRejectionWarning:未处理的承诺 rejection(rejection id:2):TypeError:acc.push不是函数
帮助?
答案 0 :(得分:3)
这是因为Array.prototype.push()返回数组的新长度,而不是数组本身。您的代码将在reducer的一次迭代中运行,将累积值设置为整数,然后在下一次迭代时失败。
修复只是在修改后返回数组:
let fullConversations = [{a: 1}, {b: 2}].reduce(function(acc, next) {
console.log(acc.push(next))
return acc
}, []);
console.log(fullConversations)
但请注意,您应始终将纯函数传递给Array.prototype.reduce()
。保持这个规则首先会让你免于这个问题。例如:
console.log([{a: 1}, {b: 2}].reduce((mem, next) => mem.concat([next]), []))