【问题标题】:Electron: dialog.showOpenDialog not returning a promise?电子:dialog.showOpenDialog 不返回承诺?
【发布时间】:2024-01-10 02:21:01
【问题描述】:

我想在渲染的脚本中显示一个打开对话框。

我从不同来源获得了相互矛盾的信息,但据我所知,https://electronjs.org/docs/api/dialog 的文档表明我应该能够使用:

const dialog = require('electron').remote.dialog;
dialog.showOpenDialog({ title: '…', defaultPath: '…' })
.then(data=>console.log(data));

我得到的错误信息是:

TypeError: dialog.showOpenDialog(...).then is not a function

这表明dialog.showOpenDialog() 没有按照文档返回承诺。文档中的示例也不适用于我。

我知道我可以使用dialog.showOpenDialog(options,callback),并且已经成功了,但是为什么我不能使用.then()

我还注意到,如果我包含可选的 BrowserWindow 参数,它会挂起,所以问题可能更广泛。

更新:

我已接受@rball 下面关于版本的回答。

看来我仍在运行 Electron 5.x,而当前版本是 6.x。文档没有具体提及,但返回结果似乎在版本之间有所不同。

更新到新的主要版本不直观。这是我必须做的更新:

npm outdated
npm install electron@latest -g --save

更新 2:

为了完整起见,这里是我用来容纳两个不同版本的 Electron 的代码:

if(dialog.showOpenDialog.then)
    dialog.showOpenDialog({
        title: 'Title',
        defaultPath: '…'
    })
    .then(result=> {
        if(result.canceled) return;
        var files=result.filePaths;
        //  process
    });
else
    dialog.showOpenDialog({
        title: 'Title',
        defaultPath: '…'
    },result=> {
        if(result===undefined) return;
        var files=result;
        //  process
    });

【问题讨论】:

  • 不确定,但可能会在 promise 对象上发现错误,即 dialog.showOpenDialog().then().catch() 本身可以提供帮助。
  • Shoot 也遇到了同样的问题。可惜没人回答。

标签: electron es6-promise renderer opendialog


【解决方案1】:

同样的事情发生在我身上,我的解决方法是应用 then 方法并获取 filePaths

dialog.showOpenDialog({
   properties: ['openDirectory']
}).then((data) => {
   console.log(data.filePaths);
});

【讨论】:

  • 感谢这个很好的例子。我能够用它来修复我的代码。真的帮助我摆脱了代码的困境。 +100 生命值 :)
【解决方案2】:

运行npm outdated 并检查您的版本。在我的版本中, showOpenDialog 返回一个字符串数组而不是一个承诺。更新后,它工作了。

【讨论】:

  • 谢谢。我在我的问题中添加了一些关于如何更新 Electron 的信息。
【解决方案3】:

我认为您阅读的文档版本有误。在版本 6 之前,dialog.showOpenDialog() 返回 String[] 而不是 Promise<Object>

这是文档:

希望我的回答能帮到你

【讨论】:

  • 这有助于知道他们更改了返回结果,但没有在他们的文档中提及。