在for循环中调用具有回调的函数

我想在for循环传递不同的文件条目时运行window.resolveLocalFileSystemURI(file,success,fail) ,并且只有在我获得所有条目后才想在数组中返回已解析的条目。

 function resolveFiles(result,callback) { var resultData=[] window.resolveLocalFileSystemURI(result, function(entry) { resolvedGalleryImages.push(entry); callback(resolvedGalleryImages); resolvedGalleryImages=[]; }, function(e) { alert("err"+e);}); } //calling-- //@filesarr has captured images uris for(i = 0; i < filesarr.length; i++) { resolveFiles(filesarr[i],function(result){ var resultArr = result; }); } 

在获取所有条目之前,如何防止调用回调。

有多种主要方法可以解决这样的问题:

  1. 手动编码异步循环
  2. 使用promises协调多个异步操作
  3. 使用像Async这样的库来协调多个异步操作

这是手册版本:

 function getFiles(filesarr, doneCallback) { var results = new Array(filesarr.length); var errors = new Array(filesarr.length); var errorCnt = 0; var overallCnt = 0; function checkDone() { if (overallCnt === filesarr.length) { if (errorCount) { doneCallback(errors, results); } else { doneCallback(null, results); } } } for (var i = 0; i < filesarr.length; i++) { (function(index) { window.resolveLocalFileSystemURI(url, function (entry) { results[index] = entry; ++overallCnt; checkDone(); }, function (e) { errors[index] = e; ++errorCount; ++overallCnt; checkDone(); }); })(i); } } getFiles(filesarr, function(errArray, results) { if (errArray) { // go errors here } else { // process results } }); 

而且,这是一个使用ES6承诺的版本:

 // make a promisified function function resolveFile(url) { return new Promise(function(resolve, reject) { window.resolveLocalFileSystemURI(url, resolve, reject); }); } function getFiles(filesarr) { var promises = []; for (var i = 0; i < filesarr.length; i++) { promises.push(resolveFile(filesarr[i])); } return Promise.all(promises); } getFiles(filesarr).then(function(results) { // process results here }, function(err) { // error here }); 

这一切都基于你所有的同步function,如果没有:更具体的是你正在使用的。 (这里没有jQuery你的标签说jquery)

 function resolveFile(path) { var result; window.resolveLocalFileSystemURI(path, function(file) { result = file; }); return file; } var resolvedFiles = filesarr.map(resolveFile); callback(resolvedFiles);