#javascript #node.js #express
#javascript #node.js #выразить
Вопрос:
Это мой код :
app.get("/", (req, res) => {
const reducer = (acc, guildCount) => acc guildCount;
const results = client.shard.fetchClientValues('guilds.cache.size');
console.log(results)
let guildCount = results.reduce(reducer, 0)
console.log(guildCount)
renderTemplate(res, req, "index.ejs", { guildCount });
});
Некоторые подробности:`
client.shard.fetchClientValues('guilds.cache.size')
Возврат Promise { <pending> }
.
Ошибка, когда я хочу загрузить это: TypeError: results.reduce is not a function
`
Этот код работает :
client.shard.fetchClientValues('guilds.cache.size')
.then(results => {
console.log(`${results.reduce((acc, guildCount) => acc guildCount, 0)} total guilds`);
})
.catch(console.error);
Но я должен определить результат в переменной, чтобы экспортировать его.
Как я могу это исправить? Есть ли другой способ определить результат с помощью reduce?
Комментарии:
1. Когда обещание разрешает, в каком формате находится
results
?
Ответ №1:
Метод Reduce работает с массивами, поэтому, если значение reduce не определено, первое, что вы узнаете, «результаты» не являются массивом. Теперь вопрос в том, почему?
const results = client.shard.fetchClientValues('guilds.cache.size');
это асинхронный метод, который возвращает обещание. и когда вы используете его без .then()
взамен вы получите объект promise, а не массив. вам придется подождать, пока обещание будет выполнено.
const results = await client.shard.fetchClientValues('guilds.cache.size');
чтобы исправить это, вы можете использовать async await
app.get("/", async (req, res) => {
const reducer = (acc, guildCount) => acc guildCount;
const results = await client.shard.fetchClientValues('guilds.cache.size');
console.log(results)
let guildCount = results.reduce(reducer, 0)
console.log(guildCount)
renderTemplate(res, req, "index.ejs", { guildCount });
});
для получения дополнительной информации о Array.prototype.reduce()
Ответ №2:
Ваш второй подход правильный. С этого момента ваш метод должен быть асинхронным. Раз асинхронный, всегда асинхронный. Нет способа вернуть его к синхронному.
К счастью, .get()
метод, в котором вы находитесь, уже асинхронный, поэтому просто переместите все после этого в .then()
:
app.get("/", (req, res) => {
const reducer = (acc, guildCount) => acc guildCount;
client.shard.fetchClientValues('guilds.cache.size')
.then(results => {
console.log(results)
let guildCount = results.reduce(reducer, 0)
console.log(guildCount);
renderTemplate(res, req, "index.ejs", { guildCount });
}).catch(console.error);
});
Комментарии:
1. Ваш
catch()
должен также ответить на запрос по крайней мере с ошибкой 500
Ответ №3:
reduce
является ли Array helper, где result
является promise
,
Таким образом, либо выполняйте свои операции внутри then
, как
client.shard.fetchClientValues('guilds.cache.size').then(results => results.reduce(reducer, 0))
или
Использовать async
await
const start = async () => {
...
const results = await client.shard.fetchClientValues('guilds.cache.size')
results.reduce(reducer, 0)
...
}
start()