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

使用Electron的用户输入JavaScript-Window.Prompt()的替代方案,javascript,electron,blockly,Javascript,Electron,Blockly,首先,在深入研究这个问题之前,我问了一个更简单的问题。然而,随着我的搜索,事情变得越来越复杂,我可以更详细地描述它 我正试图用谷歌的Blockly创建一个电子应用程序。重命名Blockly域中的变量会在用户浏览器中打开一个提示,询问新变量的名称,如您所见(单击“计数”并选择“重命名变量…”) 问题是:Electron不支持window.prompt(),如果我让代码保持原样,它也不会做任何事情,因此,在搜索了一点之后,我了解到您可以块重写。prompt以使用您自己的。我猜:所以你可以使用wind

首先,在深入研究这个问题之前,我问了一个更简单的问题。然而,随着我的搜索,事情变得越来越复杂,我可以更详细地描述它

我正试图用谷歌的Blockly创建一个电子应用程序。重命名Blockly域中的变量会在用户浏览器中打开一个提示,询问新变量的名称,如您所见(单击“计数”并选择“重命名变量…”)

问题是:Electron不支持
window.prompt()
,如果我让代码保持原样,它也不会做任何事情,因此,在搜索了一点之后,我了解到您可以块重写
。prompt
以使用您自己的。我猜:所以你可以使用
window.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}));
};
编辑:来自电子提示的源代码是,通过查看它和我试图修改的信息,我改为上面的代码,推断提示返回一个承诺。但是,
中的
回调
似乎是块式的。提示符
没有等待通过
setPrompt()
中打开的模式输入并抛出错误,但是如果我使用一个简单的函数只是在
回调
中返回一个字符串,它会正常工作

现在我很困惑,是因为我自己仍然在错误地使用承诺,还是因为
中的
回调
不支持“等待承诺”


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

我设法解决了它,我正在发布它,以防任何人需要有关
的明确答案。提示
覆盖。重写时的
回调
函数似乎必须返回新变量的字符串,因此我尝试在重写中使用
承诺
,并调用一个简单函数,仅应用
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))})
}

then()
不会返回空字符串,它将返回承诺。但是,您从未查看
then()
的返回值。您似乎看到了
promptreurn()
的返回值,它将是
未定义的
,因为没有与
promptreurn()
函数关联的
return
语句,返回
newName
,并在
promptreurn()
中预先声明newName。它表示“r未定义”,并且
newName
也未定义。我不知道什么是承诺,不过…谷歌存在是件好事。这让你很容易发现什么是承诺。根据你提供的信息,我找到了一些提示。现在我正在尝试
then((input)=>{var newName=input})
on
promptreurn()
callback(promptreurn(message,defaultValue)。然后((newName)=>{returnnewname})
中被阻塞。提示
但我得到“无法读取未定义的属性”then”。。。我真的不明白在
electron-prompt
中声明的承诺是如何实现的,
promptreurn
似乎仍然没有
return
语句,因此它将返回
undefined
您在回调中提供的
renameVar
函数除了返回名称之外什么都不做。您可以直接将
name
变量放入回调中。此外,每次调用
window.prompt()
,都会覆盖提示,因此不仅用于重命名变量,也用于创建变量。考虑使用<代码> MSG变量来确定提示正在使用什么,并相应地调整标题和标签。