javascript - 如何在 forEach 之后运行 lastTask

标签 javascript angularjs cordova ionic-framework promise

我有一组图像,我对其进行迭代并将每个图像上传到远程服务器。文件上传后,我使用结果获取文件名并推送到另一个数组。

我遇到的问题是并非所有结果都被推送到数组中。我正在尝试用所有上传图片的结果构建一个数组。以下代码在 forEach 循环完成之前执行 lastTask:

    /**
     * Upload picture
     */
    $scope.upload = function () {

      var token = window.localStorage.getItem('yourTokenKey');
      var defer = $q.defer();
      var promises = [];

      var options = {
        fileKey: "image",
        fileName: " test.png",
        chunkedMode: true,
        mimeType: "image/png",
        headers: {'x-auth-token': token}
      };

      function lastTask() {
        alert(promises);
        $scope.images = [];
        $scope.hide();
        $scope.showAlert();
        $scope.putQc();
        alert('finish').then(function () {
          defer.resolve();
        });
      }

      angular.forEach($scope.images, function (image) {
        $cordovaFileTransfer.upload("http://server.com/file/upload", image, options).then(function (result) {
          // Success!
          promises.push(result.response + '.jpg');
          alert(JSON.stringify(result));
          console.log("SUCCESS: " + JSON.stringify(result.response));
          // Error
        }, function (err) {
          alert(JSON.stringify(err));
          console.log("ERROR: " + JSON.stringify(err));
          // constant progress updates
        }, function (progress) {
          $scope.show();
        });
      });

      $q.all(promises).then(lastTask);

      return defer;
};

最佳答案

如果我是对的,你的 promises 数组就是问题所在,而不是推送来自 $cordovaFileTransfer.upload 的 promises 你推送的是结果 string 你得到的。

第二期,我觉得你做的是promise anti-pattern ,这里不需要 $q.defer()

(第三,可能无关紧要,JSON.stringify并不是真正需要的,希望alert是你自己定义的)

我会把它重写为:

/**
 * Upload picture
 */
$scope.upload = function () {

  var token = window.localStorage.getItem('yourTokenKey');
  var promises = [], results;   //CHANGED

  var options = {
    fileKey: "image",
    fileName: " test.png",
    chunkedMode: true,
    mimeType: "image/png",
    headers: {'x-auth-token': token}
  };

  function lastTask() {
    alert(results);   //CHANGED
    $scope.images = [];
    $scope.hide();
    $scope.showAlert();
    $scope.putQc();
    return alert('finish');   //CHANGED
  }

  promises = $scope.images.map(function (image) {   //CHANGED
    return $cordovaFileTransfer.upload("http://server.com/file/upload", image, options).then(function (result) {   //CHANGED
      // Success!
      results.push(result.response + '.jpg');   //CHANGED
      alert(JSON.stringify(result));
      console.log("SUCCESS: " + JSON.stringify(result.response));
      // Error
    }, function (err) {
      alert(JSON.stringify(err));
      console.log("ERROR: " + JSON.stringify(err));
      throw err;
      // constant progress updates
    }, function (progress) {
      $scope.show();
    });
  });

  return $q.all(promises).then(lastTask);   //CHANGED

};

关于javascript - 如何在 forEach 之后运行 lastTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30881853/

相关文章:

JavaScript 函数总是返回 0

javascript - 如何在选择图像时显示图像

javascript - 通过ajax从本地目录解析gz文件中的json - angularJS

javascript - 未评估的 ng 类

ios - Cordova 推送通知角标(Badge)未显示在应用程序图标 iOS 上

php - Phonegap Android 应用程序 - 保护数据流量

javascript - 无法在 Cordova Android 应用程序中访问加速度计

javascript - 无法在 Web SQL 数据库中创建新表

javascript - this.each 没有正确遍历集合

javascript - 数组中对象的 Ng 重复不起作用