#javascript #asynchronous #aws-lambda #async-await #slack-api
#javascript #асинхронный #aws-lambda #асинхронный -ожидание #slack-api
Вопрос:
Я пытаюсь отправить прямое сообщение с помощью slack web api пользователю, но я думаю, что мой метод getSlackUser, который получает всех доступных пользователей, не завершается вовремя, когда я вызываю slackId;
console.log(slackId) дает неопределенное значение, что он не завершает мой вызов api с помощью bolt
как мне обеспечить завершение метода getSlackUser (сделать его блокирующим), прежде чем он перейдет к остальным?
const { WebClient } = require('@slack/web-api');
const { App } = require('@slack/bolt')
const rtm = new RTMClient(process.env.SLACK_OAUTH_TOKEN);
const web = new WebClient(process.env.SLACK_OAUTH_TOKEN);
const app = new App({
token: process.env.SLACK_OAUTH_TOKEN,
signingSecret: process.env.SLACK_SIGNING_SECRET
});
exports.handler = async (event) => {
const slackId = await getSlackUser('example_real_name').id;
console.log(slackId);
await sendSlackMessage(slackId, 'Bot message');
}
sendSlackMessage = async (channel, message) => {
await web.chat.postMessage({
channel: channel,
text: message,
as_user: true
});
}
getSlackUser = async(real_name) => {
const result = await app.client.users.list({
token: process.env.SLACK_OAUTH_TOKEN
});
console.log(result);
return result.members.find((user) => user.real_name == real_name);
}
Комментарии:
1. Дает ли console.log (результат), отображающий список пользователей, что-то? и если да, есть ли в этом массиве элементов реальное имя, совпадающее с вводимым real_name?
2. да, он выдает ответ, подобный показанному здесь: api.slack.com/methods/users.list
Ответ №1:
Проблема заключается в приоритете в этой строке:
const slackId = await getSlackUser('example_real_name').id;
Поскольку доступ участника имеет более высокий приоритет (оцененный ранее), чем await, он фактически такой же, как:
const slackId = await (getSlackUser('example_real_name').id);
getSlackUser
возвращает объект Promise, тогда его id
член не определен. Await ожидает неопределенного, то есть undefined
.
Чтобы исправить это, убедитесь, что ожидание оценивается перед .id
:
const slackId = (await getSlackUser('example_real_name')).id;