Angularjs Cordova fileTransfer多个承诺文件

Angularjs Cordova fileTransfer多个承诺文件,angularjs,cordova,promise,angular-promise,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(

我正试图从服务器上下载大约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
函数,让函数返回一个承诺。我将这个承诺推送到一个数组中,并等待该数组中的所有承诺都得到解决

但是,在下载第一个映像之前,会调用
console.log(“所有承诺已完成”)
。我希望在下载完所有图像后调用此命令


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

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

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;

}

但仅供参考:该公司已经在以正确的方式将您的
cordova插件
包装到
angularjs
中。我建议使用它,因为它不太容易出错……

对于ngCordova版本,我会得到相同的插件。多个文件下载会导致单独的成功/错误/然后处理程序。但我需要倾听所有的承诺。有错误吗?尝试附加一个
.catch
块以查找其他错误。无错误。甚至都不在,接住。这很奇怪。因此,无论映像是否存在,都会调用fileTransfer.download函数的success and error回调中的日志。美好的因此,延迟的问题也应该被拒绝或解决。看起来$q.all没有检测到这一点。问题是deferred.reject()。服务器上没有一些图像,因此承诺被拒绝,永远无法完成$q.all。谢谢你的帮助!