首先,在询问here之前,我问过这个问题的简单版本。但是,当我搜索事物时,事情变得更加复杂,我可以对其进行更多描述。

我正在尝试用Google的Blockly创建一个Electron App。在Blockly的域中重命名变量会在用户浏览器中打开一个提示,询问新变量的名称,您可以看到on it's own website(单击“Count”并选择“Rename variable ...”)。

问题是: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的源代码是here,通过查看它和我试图从here改编的信息,我更改为上面的代码,从而推断prompt返回了promise。但是,似乎callback中的Blockly.prompt不会等待通过setPrompt()中打开的模态输入并引发错误,但是如果我使用一个简单的函数只是在callback中返回一个字符串,它将按预期工作...

现在我很困惑,如果是关于我自己仍然使用Promises错误,或者callback中的Blockly.prompt不支持“等待 promise ” ...

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

最佳答案

我设法解决了这个问题,我将其发布,以防有​​人需要有关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))})
}

关于javascript - 用户输入带有Electron的JavaScript-替代Window.Prompt(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49426346/

10-11 09:01