2016-01-15 53 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);