使用 Electron 的用户输入 JavaScript - 替代 Window.Prompt()

User input JavaScript with Electron - alternative to Window.Prompt()

首先,在 here 中深入研究之前,我问过这个问题的一个更简单的版本。然而,当我搜索的时候,事情变得更复杂了,我可以描述得更多一些。

我正在尝试使用 Google 的 Blockly 创建一个 Electron 应用程序。重命名 Blockly 域中的变量会在用户浏览器中打开一个提示,要求输入新变量的名称,如您所见 on it's own website(单击 'Count' 并选择 'Rename variable...')。

问题是:Electron 不支持 window.prompt() 如果我让代码保持原样,它不会做任何事情,所以,经过一番搜索,我了解到你可以覆盖 Blockly.prompt 使用你自己的。我的猜测:所以你可以使用 window.prompt()

的替代方法

我安装了 electron-prompt 并试图用它来获取用户在新提示中的输入 window 以将其发送回 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 的源代码是 here and, by looking at it and information I tried to adapt from here,我更改为上面的代码,推断 prompt returns 一个承诺。但是,似乎 Blockly.prompt 中的 callback 不等待通过 setPrompt() 中打开的模式输入并抛出错误,但是如果我使用一个简单的函数只返回一个字符串callback,它按预期工作...

现在我很困惑,如果是关于我自己仍然错误地使用 Promises,或者如果 Blockly.prompt 中的 callback 不支持 "waiting for promises"...

希望这有助于解释我在查找有关此问题的更多信息后尝试使用的内容。

我设法解决了它,我发布它以防有人需要关于 Blockly.prompt 覆盖的明确答案。似乎 callback 函数在重写时必须 return 新变量的字符串,所以我尝试在重写中使用 promise 并调用一个简单的函数来应用 [= 的值14=]如下:

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))})
}