Пользовательский ввод JavaScript с помощью Electron - альтернатива Window.Prompt()

Прежде всего, я задал более простую версию этого вопроса, прежде чем слишком углубляться в него в здесь . Однако по мере того, как я искал вещи, все усложнялось, и я могу описать это немного подробнее.

Я пытаюсь создать приложение Electron с Google Blockly. Переименование переменных в домене Blockly открывает в браузере пользователя приглашение запросить имя новой переменной, как вы можете видеть на собственном веб-сайте (нажмите «Подсчитать» и выберите «Переименовать переменную...»).

Проблема в том, что Electron не поддерживает window.prompt(), и он ничего не делает, если я оставлю код как есть, поэтому, немного поискав, я узнал, что вы можете переопределить Blockly.prompt, чтобы использовать свой собственный. Мое предположение: так что вы можете использовать альтернативу window.prompt()

Я установил electron-prompt и пытался использовать его, чтобы получить ввод пользователя в новом окне подсказки для отправьте его обратно в основные функции Blockly, которые обрабатывают переименование. Вот что я пытаюсь:

var prompt = require('electron-prompt');
var setPrompt = function()
{ 
    return prompt
    ({
        title: 'Renaming',
        label: 'Renaming variable to:',
        type: 'input'
    })
};

var getPrompt = function()
{
    return setPrompt().then(function(value){return value})
}

var promptReturn = function()
{
    return getPrompt().then(function(value){return value})
}

Blockly.prompt = function(message, defaultValue, callback)
{
    callback(promptReturn().then(function(value){return value}));
};

РЕДАКТИРОВАТЬ: исходный код из electron-prompt находится здесь и, просмотрев его и информацию, которую я пытался адаптировать из здесь, я изменил код выше, делая вывод, что prompt возвращает обещание. Однако кажется, что callback в Blockly.prompt не ждет ввода через модальное окно, открытое в setPrompt(), и выдает ошибку, но если я использую простую функцию, просто возвращающую строку в callback, она работает как задумано...

Теперь я в замешательстве, если дело в том, что я все еще неправильно использую обещания, или если этот callback в Blockly.prompt не поддерживает «ожидание обещаний»...

Надеюсь, это поможет объяснить, что я пытался использовать после поиска дополнительной информации об этой проблеме.


person BloodySinner    schedule 22.03.2018    source источник
comment
then() не вернет пустую строку, она вернет обещание. Однако вы никогда не смотрите на возвращаемое значение then(). Похоже, вы смотрите на возвращаемое значение promptReturn(), которое будет undefined, потому что с вашей функцией promptReturn() нет оператора return.   -  person Quentin    schedule 22.03.2018
comment
Я пробовал return r или даже делал then((r) => {newName = r}), возвращая newName с newName, объявленным заранее в promptReturn(). Он говорит, что r не определен, и newName также становится неопределенным. Я понятия не имею, что такое обещание, хотя...   -  person BloodySinner    schedule 22.03.2018
comment
Хорошо, что есть Гугл. Это позволяет легко узнать, что такое обещание.   -  person Quentin    schedule 22.03.2018
comment
Основываясь на предоставленной вами информации, я нашел здесь несколько советов. Теперь я пытаюсь then((input) => {var newName = input}) на promptReturn() и callback(promptReturn(message, defaultValue).then((newName) => {return newName})); на Blockly.prompt, но я получаю Невозможно прочитать свойство 'then' неопределенного... Я действительно не понял, как обещание объявлено в electron-prompt...   -  person BloodySinner    schedule 22.03.2018
comment
promptReturn по-прежнему не имеет оператора return, поэтому он вернет undefined   -  person Quentin    schedule 22.03.2018
comment
Пытался добавить var newName, присваивая input и возвращая его в конце promptReturn(). Теперь я получаю promptReturn(...).then не является функцией.   -  person BloodySinner    schedule 22.03.2018


Ответы (1)


Мне удалось решить эту проблему, я публикую ее на случай, если кому-то понадобится четкий ответ относительно переопределения Blockly.prompt. Кажется, что функция callback при переопределении должна возвращать строку новой переменной, поэтому я попытался использовать promise в переопределении и вызвать простую функцию, чтобы применить значение then() следующим образом:

var prompt = require('electron-prompt');
var renameVar = function(name)
{
    return name;
}

Blockly.prompt = function(msg, defaultValue, callback)
{
    prompt
    ({
        title: 'Renaming',
        label: 'Renaming variable to:',
        type: 'input'
    }).then((name)=>{callback(renameVar(name))})
}
person BloodySinner    schedule 24.03.2018
comment
Функция renameVar, которую вы предоставляете в обратном вызове, ничего не делает, кроме как возвращает имя. Вы можете просто поместить переменную name непосредственно в обратный вызов. Кроме того, подсказка будет перезаписываться при каждом вызове window.prompt(), то есть не только для переименования переменных, но и для создания переменных. Рассмотрите возможность использования переменной msg, чтобы определить, для чего используется подсказка, и соответствующим образом откорректируйте заголовок и метку. - person Paul Siersma; 10.06.2020