Функция Asyn c с приглашением пользователя syn c - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь заставить работать пользовательское приглашение syn c в моем электронном приложении. Точнее, у меня есть объект с набором команд и шаблонных переменных.

Я хочу заменить все неизвестные переменные шаблона пользовательским вводом ... синхронно. Так что команды отправляются только после того, как все мои переменные были заменены.

Не могли бы вы мне помочь?

Вот как я называю syn c приглашение пользователя (bootstrap модальное с формой) на моей стороне (этот тест работает, и я получаю result синхронно после того, как пользователь вставил что-то в приглашение):

async function test(gui) {
    const result = await gui.syncPrompt('User question')
    console.log('result:', result)
}
test(this.gui)

Моя проблема, я очень запутался со всеми заявления async / await, и я не знаю, как я мог бы включить это в мой обычный процесс замены? Что я получил до сих пор:

const obj = {
    cmds: [
        'port {port}',
        'template1 {temp1} und template2 {temp2}',
        'template2 {temp2} und template1 {temp1}'
    ]
}

const templatePrompt = async () => {
    const map = {}
    await obj.cmds.forEach(async (element, index, array) => {
        const patt = /{.*?}/gmi
        patt.lastIndex = 0
        if (patt.test(element)) {
            await obj.cmds[index].match(patt).map(async (value) => {
                let userInput = map[value]
                if (!userInput) {
                    // Create Prompt here.
                    // userInput = Math.random() * 10
                    userInput = await this.gui.syncPrompt('User question:')
                }
                map[value] = userInput
                return true
            })
            await Object.keys(map).map(async (key) => {
                obj.cmds[index] = obj.cmds[index].replace(key, map[key])
                return true
            })
        }
    })
}
await templatePrompt()
console.log(obj)

Я забыл упомянуть, что моя настоящая проблема в том, что ... выполняется функция templatePrompt (), и появляется мое первое приглашение. В то же время, если пользователь даже наберет какой-то ввод, процесс отверстия уже завершен без замены вариабельных шаблонов. :( Моя цель - сделать «паузу» в каждом приглашении.

1 Ответ

1 голос
/ 18 марта 2020

Следующий код имитирует ожидание пользовательского ввода из последовательности запросов.

Просто используйте функцию async, for l oop и await каждый ответ.

const random = (arr) => arr[~~(Math.random()*arr.length)]

const simulatedNamePrompt = () => 
    new Promise((resolve) => 
        setTimeout(() => resolve(random(['Ben', 'Sam', 'John'])), 1500))

const simulatedAgePrompt = () => 
    new Promise((resolve) => 
        setTimeout(() => resolve(random(['19', '20', '21'])), 1500))

const questions = [
    {
        question: 'What is your name?',
        prompt: simulatedNamePrompt
    },
    {
        question: 'What is your age?',
        prompt: simulatedAgePrompt
    }
]

async function askUserQuestions(questions) {
    const responses = []
    for(const { question, prompt } of questions) {
        console.log(`Asking "${question}"`)
        const response = await prompt()
        responses.push(response)
    }
    console.log(responses)
}

askUserQuestions(questions)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...