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

我正在尝试用Google的Blockly创建一个Electron App。在Blockly的域中重命名变量会在用户浏览器中打开提示,要求您输入新变量的名称,就像您在其自己的网站上看到的那样(单击"计数"并选择"重命名变量...")。

问题是:Electron不支持window.prompt(),并且如果我按原样保留代码也不会执行任何操作,因此,经过一番搜索后,我了解到可以覆盖Blockly.prompt来使用自己的代码。我的猜测:因此您可以使用window.prompt()的替代方法

我安装了electron-prompt,并试图使用它在新的提示窗口中获取用户输入,以将其发送回处理重命名的Blockly核心功能。这是我正在尝试的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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返回了诺言。但是,看来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。
  • 谷歌存在的好东西。它很容易找出什么是Promise。
  • 根据您提供的信息,我在这里找到了一些提示。现在我尝试在promptReturn()上的promptReturn()callback(promptReturn(message, defaultValue).then((newName) => {return newName}));上使用then((input) => {var newName = input}),但是我得到了"无法读取未定义的属性" ...我真的不明白如何在electron-prompt中声明Promise。
  • promptReturn似乎仍然没有return语句,因此它将返回undefined
  • 尝试添加分配给inputvar newName并在promptReturn()的末尾将其返回。现在我得到" promptReturn(...)。那不是一个函数"。

我设法解决了这个问题,我将其发布,以防有人需要有关Blockly.prompt覆盖的明确答案。 似乎callback函数在覆盖时必须返回新变量的字符串,因此我尝试在覆盖中使用promise并调用一个简单函数以仅应用then()的值,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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变量来确定提示的用途,并相应地调整标题和标签。