Бот-строитель NodeJS SDKv4

== сравнивает ссылки на объекты.

.equals() сравнивает значения String.

Иногда == дает иллюзии сравнения значений String, как в следующих случаях:

String a="Test";
String b="Test";
if(a==b) ===> true

Это связано с тем, что при создании любого строкового литерала JVM сначала ищет этот литерал в пуле строк, и если он найдет совпадение, эта же ссылка будет передана новой String. Из-за этого получаем:

(a == b) ===> true

                       String Pool
     b -----------------> "test" <-----------------a

Однако == не выполняется в следующем случае:

String a="test";
String b=new String("test");
if (a==b) ===> false

В этом случае для new String("test") оператор new String будет создан в куче, и эта ссылка будет указана на b, поэтому b будет дана ссылка на кучу, а не на String pool.

Теперь a указывает на String в пуле String, а b указывает на String в куче. Из-за этого мы получаем:

, если (a == b) ===> false.

                String Pool
     "test" <-------------------- a

                   Heap
     "test" <-------------------- b

Пока .equals() всегда сравнивает значение String, поэтому дает true в обоих случаях:

String a="Test";
String b="Test";
if(a.equals(b)) ===> true

String a="test";
String b=new String("test");
if(a.equals(b)) ===> true

Таким образом, использование .equals() всегда лучше.

0
задан cyberf4n 10 March 2019 в 01:27
поделиться

1 ответ

Для начала вам нужно сначала создать и передать хранилище userState в ваш файл index.js.

const { ConversationState, MemoryStorage, UserState } = require('botbuilder');

[...]

const conversationState = new ConversationState(memoryStorage);
const memoryStorage = new MemoryStorage();
const userState = new UserState(memoryStorage);

[...]

const bot = new ExampleBot(conversationState, userState);

В своем файле bot.js включите и создайте экземпляр userState и назначьте профиль пользователя:

class ExampleBot {
    constructor(conversationState, userState) {
    [...]

    const USER_PROFILE = 'userProfile';
    this.userProfile = userState.createProperty(USER_PROFILE);
    this.userState = userState;

    [...]
}

Теперь вы можете получить доступ к userState. Вы можете сделать это как часть OnTurn:

async onTurn(turnContext) {
    if (turnContext.activity.type === ActivityTypes.Message) {
        const userProfile = await this.userProfile.get(turnContext, {});
        const conversationData = await this.conversationData.get(
            turnContext, { promptedForUserName: false });
        if (!userProfile.name) {
            if (conversationData.promptedForUserName) {
                userProfile.name = turnContext.activity.text;
                await turnContext.sendActivity(`Thanks ${userProfile.name}.`);
                conversationData.promptedForUserName = false;
            } else {
                await turnContext.sendActivity('What is your name?');
                conversationData.promptedForUserName = true;
            }
            await this.userProfile.set(turnContext, userProfile);
            await this.userState.saveChanges(turnContext);
        }
    }
}

или как часть водопада / шага:

async someWaterfallStep(step) {
        const user = await this.userProfile.get(step.context, {});

        if (!user.name) {
            [do something]
        } else {
            await step.context.sendActivity(`Hello ${user.name}. Nice to meet you!`);
            return step.endDialog()
        }
    }

Вы можете узнать больше о настройке состояния пользователя в этом документ .

Надежда на помощь!

0
ответ дан Steven Kanberg 10 March 2019 в 01:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: