Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Electron: dialog.showOpenDialog not returning a promise?

I would like to show an Open Dialog box from within a rendered script.

I am getting conflicting information from different sources, but, as far as I can tell, the documentation at https://electronjs.org/docs/api/dialog suggests I should be able to use:

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

The error message I get is:

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

That suggests that dialog.showOpenDialog() is not returning a promise as per documentation. The sample in the documentation doesn’t work for me either.

I know that I can use dialog.showOpenDialog(options,callback), and have successfully done so, but why can’t I use .then()?

I also note that if I include the optional BrowserWindow parameter it hangs, so the problem may be broader.

Update:

I have accepted @rball’s answer below regarding versions.

It appears that I was still running Electron 5.x, while the current version is 6.x . The documentation doesn’t specifically mention it, but the return result appears to have changed between versions.

Updating to a new major version not intuitive. Here is what I had to do to update:

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

Update 2:

For the sake of completeness, here is the code I use to accommodate two different versions of 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
    });
like image 819
Manngo Avatar asked Sep 08 '19 05:09

Manngo


3 Answers

The same happened to me and my workaround was to apply the then method and get the filePaths i.e

dialog.showOpenDialog({
   properties: ['openDirectory']
}).then((data) => {
   console.log(data.filePaths);
});
like image 147
Erick Kondela Avatar answered Sep 20 '22 10:09

Erick Kondela


I think you are reading the wrong version of the documentation. Before version 6, dialog.showOpenDialog() returns a String[] rather than a Promise<Object>.

Here is the documentation:

  • v5.0.11
  • v6.0.0

Hope my answer can help you

like image 41
P.S. Avatar answered Sep 21 '22 10:09

P.S.


Run npm outdated and check your version. In my version showOpenDialog was returning a string array and not a promise. After updating it, it worked.

like image 34
rball Avatar answered Sep 17 '22 10:09

rball