2016-01-15 29 views
-1

我想运行window.resolveLocalFileSystemURI(file,success,fail)for循环传递不同的文件条目,并希望只有在我得到所有条目后返回数组中已解析的条目。调用一个函数回调for循环

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; 
     }); 
    } 

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

+0

当前的例子坏了,你缺少一个')'属于'window.resolveLocalFileSystemURI' – DoXicK

+0

thnx @ DoXicK即输入问题。请告诉我如何实施我所问的。 –

+0

你能先在这里修复代码吗? – DoXicK

回答

0

有攻击这样一个问题的多个主要方式:

  1. 异步循环
  2. 使用承诺协调的手动编码多个异步操作
  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 
}); 
+0

@ jfiend00 thnx :) ..使用手动方法并为我工作 –

-1

这是基于你的所有函数都是同步的,如果不是的话:更具体的你正在使用什么。 (有没有jQuery的现在还没有到你的标签说的jQuery)

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