【问题标题】:Cordova fileTransfer mutliple files with promisesCordova 文件 使用 promise 传输多个文件
【发布时间】:2016-02-02 23:48:38
【问题描述】:

我正在尝试从服务器下载大约 100 张图片。这很好用。

        var promises = [];

        angular.forEach($scope.steps, function(value, key){
          promises.push(saveImageToPhone("http://192.168.178.250/w3/img/"+value.id+".jpg", value.id+".jpg"));
        });
        $q.all(promises).then(function(res) {
          console.log("all promises done");
        });

这会调用下载函数:

function saveImageToPhone(url, file) {
    var deferred = $q.defer();
    var url = url;
    var filePath = cordova.file.applicationStorageDirectory + "files/img/" +file;
    var fileTransfer = new FileTransfer();
    var uri = encodeURI(url);

    fileTransfer.download(
      uri,
      filePath,
      function(entry) {
        console.log(entry);
        deferred.resolve();
      },
      function(error) {
        console.log(error);
        deferred.reject();
      },
      false,
      {
        headers: {
          "Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA=="
        }
      }
    );
    return deferred.promise;

  }

我的想法是在 forEach 循环中调用 saveImageToPhone 函数并让函数返回一个承诺。我将这个 Promise 推送到一个数组并等待这个数组中的所有 Promise 解决。

但是,console.log("all promises done") 在下载第一个图像之前被调用。我希望在下载所有图像后调用它。

你能指出我正确的方向吗?

【问题讨论】:

    标签: angularjs cordova promise angular-promise


    【解决方案1】:

    我认为您的承诺处理是您的问题的原因...试试这个:

    function saveImageToPhone(url, file) {
        var deferred = $q.defer();
        var url = url;
        var filePath = cordova.file.applicationStorageDirectory + "files/img/" +file;
        var fileTransfer = new FileTransfer();
        var uri = encodeURI(url);
    
        fileTransfer.download(
          uri,
          filePath,
          function(entry) {
            console.log(entry);
    
            // Change here
            deferred.resolve();
          },
          function(error) {
            console.log(error);
    
            // Change here
            deferred.reject();
          },
          false,
          {
            headers: {
              "Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA=="
            }
          }
        );
    
    // Change here
    return deferred.promise;
    
    }
    

    但仅供参考:File Tansfer Plugin from ngCordova 已经以正确的方式将您的 cordova plugins 包装到 angularjs 中。我会推荐使用它,因为它不容易出错...

    【讨论】:

    • 使用 ngCordova 版本我会得到相同的插件。多个文件下载导致单独的成功/错误/然后处理程序。但我需要倾听所有承诺的解决。
    • 有什么错误吗?尝试另外附加一个.catch 块以查找错误。
    • 没有错误。甚至在 .catch 中也没有。这很奇怪。因此,无论图像是否存在,都会调用 fileTransfer.download 函数的成功和错误回调中的日志。好的。所以延期的也应该被拒绝或解决。看起来 $q.all 没有检测到这一点。
    • 问题出在 deferred.reject() 上。服务器上不存在一些图像,因此 promise 被拒绝并且永远不会完成 $q.all。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    相关资源
    最近更新 更多