【问题标题】:User input JavaScript with Electron - alternative to Window.Prompt()使用 Electron 的用户输入 JavaScript - Window.Prompt() 的替代品
【发布时间】:2018-08-31 18:06:12
【问题描述】:

首先,在here 对此问题进行深入研究之前,我已经询问了这个问题的一个更简单的版本。但是,当我搜索时,事情变得更加复杂,我可以再描述一下。

我正在尝试使用 Google 的 Blockly 创建一个 Electron 应用程序。在 Blockly 的域中重命名变量会在用户浏览器中打开一个提示,询问新变量的名称,如您所见 on it's own website(点击“计数”并选择“重命名变量...”)。

问题是: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 返回一个承诺。但是,似乎Blockly.prompt 中的callback 不会等待通过setPrompt() 中打开的模式输入并引发错误,但是如果我使用一个简单的函数,只在callback 中返回一个字符串,它就可以工作正如预期的那样......

现在我很困惑,是因为我自己还在错误地使用 Promises,或者 Blockly.prompt 中的 callback 不支持“等待承诺”...

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

【问题讨论】:

  • then() 不会返回一个空字符串,它会返回一个 Promise。但是,您永远不会查看 then() 的返回值。您似乎确实查看了promptReturn() 的返回值,这将是undefined,因为没有与您的promptReturn() 函数关联的return 语句。
  • 我尝试过return r 甚至是then((r) => {newName = r}),返回newName 并在promptReturn() 中预先声明了newName。它说“r 未定义”,newName 也未定义。不过,我不知道 Promise 是什么......
  • Google 存在是好事。它可以很容易地找出 Promise 是什么。
  • 根据您提供的信息,我找到了here一些提示。现在我在promptReturn()Blockly.prompt中尝试then((input) => {var newName = input})callback(promptReturn(message, defaultValue).then((newName) => {return newName}));,但我得到“无法读取未定义的属性'then'”......我真的不明白Promise是如何声明的electron-prompt...
  • promptReturn 似乎仍然没有return 语句,因此它将返回undefined

标签: javascript electron blockly


【解决方案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))})
}

【讨论】:

  • 您在回调中提供的renameVar 函数除了返回名称之外什么也不做。您可以将name 变量直接放在回调中。此外,每次调用window.prompt() 时都会覆盖提示,因此不仅用于重命名变量,还用于创建变量。考虑使用msg 变量来确定提示的用途,并相应地调整标题和标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 2015-08-11
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多