2016-06-08 2 views
4

Я пытаюсь написать бот, который позволит пользователям создать запрос (например, я хочу купить футболку, или я хочу исправить свой компьютер). В зависимости от запроса, который они выбирают, им будет задан ряд вопросов, связанных с этим запросом; вопросы напрямую связаны с запросом, который они выбирают. В настоящее время я пытаюсь повторить этот список вопросов и использовать метод PromptDialog.Text, чтобы получить ответы. Тем не менее, это только задает последний вопрос в Списке, и когда дается ответ, я получаю сообщение об ошибке с Неправильная необходимость: ожидается Подождите, сделайте в качестве сообщения.PromptDialog для неопределенного количества вопросов

private async Task ListOfferings(IDialogContext context, IAwaitable<string> result) 
{ 
    string name = await result; 
    var offerings = Offerings.Where((x) =>   
     CultureInfo.CurrentCulture.CompareInfo.IndexOf(x.Name, name, 
     CompareOptions.IgnoreCase) >= 0 
    ); 
    if (offerings.Count() != 0) 
    { 
     PromptDialog.Choice(context, CreateOffering, offerings, "Which of these would you like?"); 
    } 
    else 
    { 
     await context.PostAsync(string.Format("Could not find an offering with name {0}", name)); 
     context.Wait(MessageReceived); 
    } 
} 


private async Task CreateOffering(IDialogContext context, IAwaitable<Offering> result) 
{ 
    var offering = result.GetAwaiter().GetResult(); 
    await context.PostAsync(string.Format("***CREATING {0}***", offering.Name.ToUpper())); 

    foreach (var question in offering.Questions) 
    { 
     PromptDialog.Text(context, null, question.Question); 
    } 
} 

Можно ли сделать что-то вроде этого, где я хочу, чтобы динамически решать вопросы пользователя будут заданы во время выполнения или я должен принять более статический подход по сценарию?

ответ

2

Вы не можете просто выполнять несколько вызовов PromptDialog.Text в цикле, потому что вам нужно подождать ответа пользователя после каждого вопроса. Попробуйте сделать это таким образом:

private int questionNumber; 
private Offering offering; 

private async Task CreateOffering(IDialogContext context, IAwaitable<Offering> result) 
{ 
    offering = await result; 
    await context.PostAsync($"***CREATING {offering.Name.ToUpper()}***"); 
    questionNumber = 0; 
    // fix access to a particular question in case Questions is not an IList 
    PromptDialog.Text(context, OnQuestionReply, offering.Questions[questionNumber].Question); 
} 

private async Task OnQuestionReply(IDialogContext context, IAwaitable<string> result) 
{ 
    var answer = await result; 
    // handle the answer for questionNumber as you need 

    questionNumber++; 
    // use Count instead of Length in case it is not an array 
    if (questionNumber < offering.Questions.Length) 
    { 
     PromptDialog.Text(context, OnQuestionReply, offering.Questions[questionNumber].Question); 
    } 
    else 
    { 
     // do what you need when all the questions are answered 
     await context.PostAsync("I have no more questions for this offering."); 
     context.Wait(MessageReceived); 
    } 
} 
Смежные вопросы