【发布时间】: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