代码之家  ›  专栏  ›  技术社区  ›  django

electron dl use promise.all用于多个同时下载

  •  5
  • django  · 技术社区  · 6 年前

    我正在使用 Electron-dl 根据 documentation 下载功能 download(window,URL,Options) 只接受URL 回报承诺

    目标:

    1. 我想同时下载一组文件
    2. 在里面 then () 我想得到给定数组的dl.getSavePath()路径
    3. 在里面 catch() 我想为给定数组的失败项获取错误
    4. 可以保证。所有人都做这个工作?还有别的选择吗?

    代码有什么问题: then() 正在立即调用,而不是等待所有下载完成

    zip文件:

    electron-dl-multi.zip
    使用 npm install && npm start

    大数组测试:

      var files = [
        'https://download.filezilla-project.org/client/FileZilla_3.34.0_win64-setup_bundled.exe',
        'http://the.earth.li/~sgtatham/putty/latest/w32/putty-0.70-installer.msi',
        'http://speedtest.ftp.otenet.gr/files/test10Mb.db'
      ]
    

    代码:

    var files= [
    'http://speedtest.ftp.otenet.gr/files/test100k.db', 
    'https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png'];
          var promises = [];
          var _browserWindow = BrowserWindow.getFocusedWindow();
          //
          for (var i = 0; i < files.length; i++) {
            promises.push(download(_browserWindow, files[i], {
              directory: os.tmpdir() // Default is User's downloads directory
            }).then(function (dl) {
              return dl.getSavePath();
            }).catch(function (err) {
              return err;
            }));            
          }
          Promise.all(promises)
            .then(function (_files) {
              console.log(_files);
            }).catch(function (err) {
              console.log( err);
            });
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Air1    6 年前

    我认为您的代码是可以的-除了在注释中所说的,也许您不应该在 promises.push 但是相反,你只要把它放进去 Promise.all 是的。

    我从你的zip中运行了这个应用程序,它运行正常并正确下载了2个文件。

    但后来我尝试改变一些URL,把一个不存在的网址放在这里:嗯,问题就在这里。在这种情况下 download 函数不能解决承诺(这是正常的),也不能拒绝承诺(它应该拒绝)。

    自己运行以下简单代码:

    download(mainWindow, 'https://nothing.wrong-url.org', {
      directory: os.tmpdir() // Default is User's downloads directory
    }).then(function (dl) {
      console.log(dl.getSavePath());
    }).catch(console.error)
    

    这个承诺只是悬在这里,没有解决,也没有拒绝。您可能会在Electron DL Github上打开一个问题。