Cordova fileTransfer mutliple文件与promises

时间:2016-02-02 10:04:49

标签: angularjs cordova promise angular-promise

我正在尝试从服务器下载大约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。我将此承诺推送到数组并等待此数组中的所有承诺解决。

然而,在下载第一张图片之前调用console.log("all promises done")。我希望在下载所有图像后调用它。

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

1 个答案:

答案 0 :(得分:3)

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

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中。我建议使用它,因为它不易出错......