1

您能否提供一个使此代码异步的示例 1)我必须通过 $http.get 函数从服务器读取文件 2)将文件读取到数组 3)处理它(重新构建它)4)并显示进度条每一个动作

所以代码是:

$http.get(filename).success(function (data) {
     words = data.split(/\n| /);
     reBuild(words) //this action takes at least 5 seconds
     Process(words) // this action takes at least 4 seconds
})

我想让它异步,我不想在执行 reBuild 和 Process 时冻结我的线程知道如何做到这一点吗?

4

2 回答 2

0

假设 'reBuild' 必须在 'Process' 运行之前完成,IMO 处理它的最佳方法是让 reBuild 和 Process 函数返回承诺。Promise 是一种处理异步事件的 JavaScript 方式 - http://docs.angularjs.org/api/ng .$q 。

例如,对于您的 reBuild 方法,而不是像这样:

var reBuild = function(words) {
  // 5 second operation here
  return words;
}

这样做:(您需要将 $q 和 $timeout 服务注入您的控制器以使其工作)

var reBuild = function(words) {
   var deferred = $q.defer();

   $timeout(function() {
       // do 5 second operation
       deferred.resolve(words);
   });

   return deferred.promise;
}

然后在您的控制器中,您可以执行以下操作:

$http.get(filename).success(function (data) {
     words = data.split(/\n| /);
     reBuild(words).then(function(reBuiltWords) {
         Process(reBuiltWords);
     }); 
})
于 2013-08-31T10:30:57.720 回答
0

您可以处理事件,但最简单的方法是使用 setTimeout 并分段处理长循环。

于 2013-08-31T10:13:46.990 回答