Я думаю, что вы немного перегружаете код. Все, что вам нужно сделать, это отфильтровать входящее событие и затем вызвать вашу функцию. См. Пример ниже.
диалоговое окно. js (пример узла-бота): Отправка простого события в качестве шага водопада. Свойство 'name', по которому я буду фильтровать, присваивается channelData
.
async eventStep ( stepContext ) {
let reply = { type: ActivityTypes.Event };
reply.channelData = { name: 'getLocation' };
await stepContext.context.sendActivities( reply );
return await stepContext.next();
}
createStore (): Я фильтрую по типу event
входящих операций. Если свойство channelData
содержит name
с правильным значением, то вызывается функция showPosition
.
const store = window.WebChat.createStore( {}, ( { dispatch } ) => next => async action => {
if (action.type === 'DIRECT_LINE/INCOMING_ACTIVITY') {
const { activity } = action.payload;
if ( activity.type === 'event' ) {
// Handle based on event type
if ( activity.channelData.name === 'getLocation' ) {
if ( navigator.geolocation ) {
await navigator.geolocation.getCurrentPosition( showPosition );
}
else {
console.log( "Geolocation is not supported by this browser." );
}
}
}
}
return next(action);
});
showPosition (): Я располагаю функцию сразу после веб-чат рендерер. Я также демонстрирую отправку SEND_MESSAGE
, SEND_MESSAGE_BACK
, SEND_POST_BACK
и SEND_EVENT
. Как данные организованы в упражнении, отличается в каждом случае. См. Ниже.
[...]
document.getElementById('BotChatGoesHere')
);
function showPosition( position ) {
const message = "Latitude: " + position.coords.latitude + " Longitude: " + position.coords.longitude;
store.dispatch( {
type: 'WEB_CHAT/SEND_MESSAGE',
payload:
{
text: message,
channelData: { latitude: position.coords.latitude, longitude: position.coords.longitude }
}
} );
store.dispatch( {
type: 'WEB_CHAT/SEND_MESSAGE_BACK',
payload:
{
text: message,
value: { latitude: position.coords.latitude, longitude: position.coords.longitude }
}
} );
store.dispatch( {
type: 'WEB_CHAT/SEND_POST_BACK',
payload: { value: { latitude: position.coords.latitude, longitude: position.coords.longitude } }
} );
store.dispatch( {
type: 'WEB_CHAT/SEND_EVENT',
payload:
{
name: 'EVENT_GET_POSITION',
value: { latitude: position.coords.latitude, longitude: position.coords.longitude }
}
} );
}
SEND_MESSAGE
: отправка сообщения; имеет текстовое поле; отображает пользователю; данные в activity.channelData
SEND_MESSAGE_BACK
: отправляется как сообщение; имеет текстовое поле; НЕ отображается пользователю; данные в activity.value
SEND_POST_BACK
: отправляется как сообщение; не имеет текстового поля; НЕ отображается пользователю; данные в activity.value
SEND_EVENT
: отправляется как событие; не имеет текстового поля; НЕ отображается пользователю; название события в activity.name
и данные в activity.value
Надеюсь на помощь!